mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 增加 HzyTuple 表达式替换类;
This commit is contained in:
		@@ -9,7 +9,9 @@ using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql
 | 
			
		||||
{
 | 
			
		||||
    public partial interface ISelect0<TSelect, T1>
 | 
			
		||||
    public partial interface ISelect0 { }
 | 
			
		||||
 | 
			
		||||
    public partial interface ISelect0<TSelect, T1> : ISelect0
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
#if net40
 | 
			
		||||
 
 | 
			
		||||
@@ -54,6 +54,7 @@ namespace FreeSql
 | 
			
		||||
 | 
			
		||||
        ISelect<T1, T2> Where(Expression<Func<T1, T2, bool>> exp);
 | 
			
		||||
        ISelect<T1, T2> WhereIf(bool condition, Expression<Func<T1, T2, bool>> exp);
 | 
			
		||||
        ISelect<T1, T2> Where(Expression<Func<NativeTuple<T1, T2>, bool>> exp);
 | 
			
		||||
 | 
			
		||||
        ISelectGrouping<TKey, NativeTuple<T1, T2>> GroupBy<TKey>(Expression<Func<T1, T2, TKey>> exp);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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