mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-19 20:38:16 +08:00
- 增加 HzyTuple 表达式替换类;
This commit is contained in:
@ -1664,6 +1664,39 @@ namespace FreeSql.Internal
|
||||
}
|
||||
}
|
||||
|
||||
internal class ReplaceHzyTupleToMultiParam : ExpressionVisitor
|
||||
{
|
||||
private List<SelectTableInfo> tables;
|
||||
private ParameterExpression[] parameters;
|
||||
public LambdaExpression Modify(LambdaExpression lambda, List<SelectTableInfo> tables)
|
||||
{
|
||||
this.tables = tables;
|
||||
parameters = tables.Select(a => a.Parameter ?? Expression.Parameter(a.Table.Type, a.Alias)).ToArray();
|
||||
var exp = Visit(lambda.Body);
|
||||
return Expression.Lambda(exp, parameters);
|
||||
}
|
||||
|
||||
protected override Expression VisitMember(MemberExpression node)
|
||||
{
|
||||
int widx;
|
||||
if (node.Expression?.NodeType == ExpressionType.MemberAccess)
|
||||
{
|
||||
var parent = node.Expression as MemberExpression;
|
||||
if (parent.Expression?.NodeType == ExpressionType.Parameter &&
|
||||
parent.Expression.Type.Name.StartsWith("NativeTuple`") == true &&
|
||||
int.TryParse(parent.Member.Name.Replace("Item", ""), out widx) && widx > 0 && widx <= tables.Count)
|
||||
return Expression.Property(parameters[widx - 1], node.Member.Name);
|
||||
}
|
||||
|
||||
if (node.Expression?.NodeType == ExpressionType.Parameter &&
|
||||
node.Expression.Type.Name.StartsWith("NativeTuple`") == true &&
|
||||
int.TryParse(node.Member.Name.Replace("Item", ""), out widx) && widx > 0 && widx <= tables.Count)
|
||||
return parameters[widx - 1];
|
||||
|
||||
return base.VisitMember(node);
|
||||
}
|
||||
}
|
||||
|
||||
public string formatSql(object obj, Type mapType, ColumnInfo mapColumn, List<DbParameter> dbParams)
|
||||
{
|
||||
//参数化设置,日后优化
|
||||
|
@ -60,7 +60,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
#endif
|
||||
_includeInfo.Clear();
|
||||
_selectExpression = null;
|
||||
_whereGlobalFilter.Clear();
|
||||
_whereGlobalFilter?.Clear();
|
||||
}
|
||||
|
||||
public static void CopyData(Select0Provider from, Select0Provider to, ReadOnlyCollection<ParameterExpression> lambParms)
|
||||
|
@ -178,6 +178,14 @@ namespace FreeSql.Internal.CommonProvider
|
||||
return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereGlobalFilter, _params));
|
||||
}
|
||||
|
||||
ISelect<T1, T2> ISelect<T1, T2>.Where(Expression<Func<NativeTuple<T1, T2>, bool>> exp)
|
||||
{
|
||||
if (exp == null) return this.Where(null);
|
||||
var exp2 = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables);
|
||||
for (var a = 0; a < exp2.Parameters.Count; a++) _tables[a].Parameter = exp2.Parameters[a];
|
||||
return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp2, null, _whereGlobalFilter, _params));
|
||||
}
|
||||
|
||||
bool ISelect<T1, T2>.Any(Expression<Func<T1, T2, bool>> exp)
|
||||
{
|
||||
if (exp == null) return this.Any();
|
||||
|
Reference in New Issue
Block a user