mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 18:52:50 +08:00
- 完善 ExpressionCall 自定义表达式功能;
This commit is contained in:
parent
5961479f2a
commit
defab45624
@ -110,6 +110,13 @@
|
|||||||
清空状态数据
|
清空状态数据
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
|
||||||
|
<summary>
|
||||||
|
根据 lambda 条件删除数据
|
||||||
|
</summary>
|
||||||
|
<param name="predicate"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:FreeSql.DbSet`1.Add(`0)">
|
<member name="M:FreeSql.DbSet`1.Add(`0)">
|
||||||
<summary>
|
<summary>
|
||||||
添加
|
添加
|
||||||
|
@ -10,6 +10,7 @@ public class g
|
|||||||
static Lazy<IFreeSql> mysqlLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
|
static Lazy<IFreeSql> mysqlLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
|
||||||
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd_mysqlconnector;Charset=utf8;SslMode=none;Max pool size=10")
|
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd_mysqlconnector;Charset=utf8;SslMode=none;Max pool size=10")
|
||||||
.UseAutoSyncStructure(true)
|
.UseAutoSyncStructure(true)
|
||||||
|
//.UseGenerateCommandParameterWithLambda(true)
|
||||||
.UseMonitorCommand(
|
.UseMonitorCommand(
|
||||||
cmd =>
|
cmd =>
|
||||||
{
|
{
|
||||||
|
@ -11,6 +11,7 @@ public class g
|
|||||||
static Lazy<IFreeSql> mysqlLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
|
static Lazy<IFreeSql> mysqlLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
|
||||||
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=2")
|
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=2")
|
||||||
.UseAutoSyncStructure(true)
|
.UseAutoSyncStructure(true)
|
||||||
|
//.UseGenerateCommandParameterWithLambda(true)
|
||||||
.UseMonitorCommand(
|
.UseMonitorCommand(
|
||||||
cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前
|
cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前
|
||||||
(cmd, traceLog) => Console.WriteLine(traceLog))
|
(cmd, traceLog) => Console.WriteLine(traceLog))
|
||||||
@ -24,6 +25,7 @@ public class g
|
|||||||
return new FreeSql.FreeSqlBuilder()
|
return new FreeSql.FreeSqlBuilder()
|
||||||
.UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=2")
|
.UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=2")
|
||||||
.UseAutoSyncStructure(true)
|
.UseAutoSyncStructure(true)
|
||||||
|
//.UseGenerateCommandParameterWithLambda(true)
|
||||||
.UseSyncStructureToLower(true)
|
.UseSyncStructureToLower(true)
|
||||||
.UseLazyLoading(true)
|
.UseLazyLoading(true)
|
||||||
.UseMonitorCommand(
|
.UseMonitorCommand(
|
||||||
@ -48,6 +50,7 @@ public class g
|
|||||||
static Lazy<IFreeSql> oracleLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
|
static Lazy<IFreeSql> oracleLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
|
||||||
.UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2")
|
.UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2")
|
||||||
.UseAutoSyncStructure(true)
|
.UseAutoSyncStructure(true)
|
||||||
|
//.UseGenerateCommandParameterWithLambda(true)
|
||||||
.UseLazyLoading(true)
|
.UseLazyLoading(true)
|
||||||
.UseSyncStructureToUpper(true)
|
.UseSyncStructureToUpper(true)
|
||||||
//.UseNoneCommandParameter(true)
|
//.UseNoneCommandParameter(true)
|
||||||
@ -61,6 +64,7 @@ public class g
|
|||||||
static Lazy<IFreeSql> sqliteLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
|
static Lazy<IFreeSql> sqliteLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
|
||||||
.UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Attachs=xxxtb.db;Pooling=true;Max Pool Size=2")
|
.UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Attachs=xxxtb.db;Pooling=true;Max Pool Size=2")
|
||||||
.UseAutoSyncStructure(true)
|
.UseAutoSyncStructure(true)
|
||||||
|
//.UseGenerateCommandParameterWithLambda(true)
|
||||||
.UseLazyLoading(true)
|
.UseLazyLoading(true)
|
||||||
.UseMonitorCommand(
|
.UseMonitorCommand(
|
||||||
cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前
|
cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前
|
||||||
|
@ -7,9 +7,9 @@ namespace FreeSql.DataAnnotations
|
|||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 自定义表达式函数解析<para></para>
|
/// 自定义表达式函数解析<para></para>
|
||||||
/// 注意:请使用静态扩展类
|
/// 注意:请使用静态方法、或者在类上标记
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[AttributeUsage(AttributeTargets.Class)]
|
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
|
||||||
public class ExpressionCallAttribute : Attribute
|
public class ExpressionCallAttribute : Attribute
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -32,9 +32,10 @@ namespace FreeSql.DataAnnotations
|
|||||||
public DbParameter DbParameter { get; internal set; }
|
public DbParameter DbParameter { get; internal set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 可附加参数化对象
|
/// 可附加参数化对象<para></para>
|
||||||
|
/// 注意:本属性只有 Where 的表达式解析才可用
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public List<DbParameter> UserParameters { get; } = new List<DbParameter>();
|
public List<DbParameter> UserParameters { get; internal set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 返回表达式函数表示的 SQL 字符串
|
/// 返回表达式函数表示的 SQL 字符串
|
||||||
|
@ -155,7 +155,7 @@
|
|||||||
<member name="T:FreeSql.DataAnnotations.ExpressionCallAttribute">
|
<member name="T:FreeSql.DataAnnotations.ExpressionCallAttribute">
|
||||||
<summary>
|
<summary>
|
||||||
自定义表达式函数解析<para></para>
|
自定义表达式函数解析<para></para>
|
||||||
注意:请使用静态扩展类
|
注意:请使用静态方法、或者在类上标记
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:FreeSql.DataAnnotations.ExpressionCallContext.DataType">
|
<member name="P:FreeSql.DataAnnotations.ExpressionCallContext.DataType">
|
||||||
@ -175,7 +175,8 @@
|
|||||||
</member>
|
</member>
|
||||||
<member name="P:FreeSql.DataAnnotations.ExpressionCallContext.UserParameters">
|
<member name="P:FreeSql.DataAnnotations.ExpressionCallContext.UserParameters">
|
||||||
<summary>
|
<summary>
|
||||||
可附加参数化对象
|
可附加参数化对象<para></para>
|
||||||
|
注意:本属性只有 Where 的表达式解析才可用
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:FreeSql.DataAnnotations.ExpressionCallContext.Result">
|
<member name="P:FreeSql.DataAnnotations.ExpressionCallContext.Result">
|
||||||
|
@ -500,6 +500,7 @@ namespace FreeSql.Internal
|
|||||||
return $"{left} {oper} {right}";
|
return $"{left} {oper} {right}";
|
||||||
}
|
}
|
||||||
static ConcurrentDictionary<Type, bool> _dicTypeExistsExpressionCallAttribute = new ConcurrentDictionary<Type, bool>();
|
static ConcurrentDictionary<Type, bool> _dicTypeExistsExpressionCallAttribute = new ConcurrentDictionary<Type, bool>();
|
||||||
|
static ConcurrentDictionary<Type, ConcurrentDictionary<string, bool>> _dicMethodExistsExpressionCallAttribute = new ConcurrentDictionary<Type, ConcurrentDictionary<string, bool>>();
|
||||||
static ConcurrentDictionary<Type, FieldInfo[]> _dicTypeExpressionCallClassContextFields = new ConcurrentDictionary<Type, FieldInfo[]>();
|
static ConcurrentDictionary<Type, FieldInfo[]> _dicTypeExpressionCallClassContextFields = new ConcurrentDictionary<Type, FieldInfo[]>();
|
||||||
public string ExpressionLambdaToSql(Expression exp, ExpTSC tsc)
|
public string ExpressionLambdaToSql(Expression exp, ExpTSC tsc)
|
||||||
{
|
{
|
||||||
@ -541,9 +542,12 @@ namespace FreeSql.Internal
|
|||||||
case ExpressionType.Call:
|
case ExpressionType.Call:
|
||||||
tsc.mapType = null;
|
tsc.mapType = null;
|
||||||
var exp3 = exp as MethodCallExpression;
|
var exp3 = exp as MethodCallExpression;
|
||||||
if (exp3.Object == null && _dicTypeExistsExpressionCallAttribute.GetOrAdd(exp3.Method.DeclaringType, dttp => dttp.GetCustomAttributes(typeof(ExpressionCallAttribute), true).Any()))
|
if (exp3.Object == null && (
|
||||||
|
_dicTypeExistsExpressionCallAttribute.GetOrAdd(exp3.Method.DeclaringType, dttp => dttp.GetCustomAttributes(typeof(ExpressionCallAttribute), true).Any()) ||
|
||||||
|
exp3.Method.GetCustomAttributes(typeof(ExpressionCallAttribute), true).Any()
|
||||||
|
))
|
||||||
{
|
{
|
||||||
var ecc = new ExpressionCallContext { DataType = _ado.DataType };
|
var ecc = new ExpressionCallContext { DataType = _ado.DataType, UserParameters = tsc.dbParams == null ? null : new List<DbParameter>() };
|
||||||
var exp3MethodParams = exp3.Method.GetParameters();
|
var exp3MethodParams = exp3.Method.GetParameters();
|
||||||
var dbParamsIndex = tsc.dbParams?.Count;
|
var dbParamsIndex = tsc.dbParams?.Count;
|
||||||
ecc.ParsedContent.Add(exp3MethodParams[0].Name, ExpressionLambdaToSql(exp3.Arguments[0], tsc));
|
ecc.ParsedContent.Add(exp3MethodParams[0].Name, ExpressionLambdaToSql(exp3.Arguments[0], tsc));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user