mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-19 20:38:16 +08:00
- 完善 ExpressionCall 自定义表达式功能;
This commit is contained in:
@ -7,9 +7,9 @@ namespace FreeSql.DataAnnotations
|
||||
{
|
||||
/// <summary>
|
||||
/// 自定义表达式函数解析<para></para>
|
||||
/// 注意:请使用静态扩展类
|
||||
/// 注意:请使用静态方法、或者在类上标记
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Class)]
|
||||
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
|
||||
public class ExpressionCallAttribute : Attribute
|
||||
{
|
||||
}
|
||||
@ -32,9 +32,10 @@ namespace FreeSql.DataAnnotations
|
||||
public DbParameter DbParameter { get; internal set; }
|
||||
|
||||
/// <summary>
|
||||
/// 可附加参数化对象
|
||||
/// 可附加参数化对象<para></para>
|
||||
/// 注意:本属性只有 Where 的表达式解析才可用
|
||||
/// </summary>
|
||||
public List<DbParameter> UserParameters { get; } = new List<DbParameter>();
|
||||
public List<DbParameter> UserParameters { get; internal set; }
|
||||
|
||||
/// <summary>
|
||||
/// 返回表达式函数表示的 SQL 字符串
|
||||
|
@ -155,7 +155,7 @@
|
||||
<member name="T:FreeSql.DataAnnotations.ExpressionCallAttribute">
|
||||
<summary>
|
||||
自定义表达式函数解析<para></para>
|
||||
注意:请使用静态扩展类
|
||||
注意:请使用静态方法、或者在类上标记
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:FreeSql.DataAnnotations.ExpressionCallContext.DataType">
|
||||
@ -175,7 +175,8 @@
|
||||
</member>
|
||||
<member name="P:FreeSql.DataAnnotations.ExpressionCallContext.UserParameters">
|
||||
<summary>
|
||||
可附加参数化对象
|
||||
可附加参数化对象<para></para>
|
||||
注意:本属性只有 Where 的表达式解析才可用
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:FreeSql.DataAnnotations.ExpressionCallContext.Result">
|
||||
|
@ -500,6 +500,7 @@ namespace FreeSql.Internal
|
||||
return $"{left} {oper} {right}";
|
||||
}
|
||||
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[]>();
|
||||
public string ExpressionLambdaToSql(Expression exp, ExpTSC tsc)
|
||||
{
|
||||
@ -541,9 +542,12 @@ namespace FreeSql.Internal
|
||||
case ExpressionType.Call:
|
||||
tsc.mapType = null;
|
||||
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 dbParamsIndex = tsc.dbParams?.Count;
|
||||
ecc.ParsedContent.Add(exp3MethodParams[0].Name, ExpressionLambdaToSql(exp3.Arguments[0], tsc));
|
||||
|
Reference in New Issue
Block a user