mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 撤销 #1727
This commit is contained in:
		@@ -25,8 +25,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
        public ParameterExpression _lambdaParameter;
 | 
					        public ParameterExpression _lambdaParameter;
 | 
				
			||||||
        public ReadAnonymousTypeInfo _map;
 | 
					        public ReadAnonymousTypeInfo _map;
 | 
				
			||||||
        public string _field;
 | 
					        public string _field;
 | 
				
			||||||
        public ReadAnonymousTypeInfo ParseExpMapResult { get; internal protected set; }
 | 
					        public ReadAnonymousTypeInfo ParseExpMapResult { get; protected set; }
 | 
				
			||||||
        public ColumnInfo ParseExpColumnResult { get; internal protected set; }
 | 
					 | 
				
			||||||
        public abstract string ParseExp(Expression[] members);
 | 
					        public abstract string ParseExp(Expression[] members);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -825,7 +824,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                        var rightBool = ExpressionLambdaToSql(rightExp, tsc);
 | 
					                        var rightBool = ExpressionLambdaToSql(rightExp, tsc);
 | 
				
			||||||
                        var rightColumn = SearchColumnByField(tsc._tables, tsc.currentTable, rightBool);
 | 
					                        var rightColumn = SearchColumnByField(tsc._tables, tsc.currentTable, rightBool);
 | 
				
			||||||
						if (rightColumn != null) rightBool = $"{rightBool} = {formatSql(true, rightColumn.Attribute.MapType, null, null)}";
 | 
					                        if (rightColumn != null) rightBool = $"{rightBool} = {formatSql(true, rightColumn.Attribute.MapType, null, null)}";
 | 
				
			||||||
                        else rightBool = GetBoolString(rightBool);
 | 
					                        else rightBool = GetBoolString(rightBool);
 | 
				
			||||||
                        if (_common._orm?.Ado?.DataType == DataType.QuestDb) return $"(({leftBool}) {oper} ({rightBool}))";
 | 
					                        if (_common._orm?.Ado?.DataType == DataType.QuestDb) return $"(({leftBool}) {oper} ({rightBool}))";
 | 
				
			||||||
                        return $"({leftBool} {oper} {rightBool})";
 | 
					                        return $"({leftBool} {oper} {rightBool})";
 | 
				
			||||||
@@ -860,10 +859,8 @@ namespace FreeSql.Internal
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Type oldMapType = null;
 | 
					            Type oldMapType = null;
 | 
				
			||||||
            if (tsc.diymemexp != null) tsc.diymemexp.ParseExpColumnResult = null;
 | 
					 | 
				
			||||||
            var left = ExpressionLambdaToSql(leftExp, tsc);
 | 
					            var left = ExpressionLambdaToSql(leftExp, tsc);
 | 
				
			||||||
            var leftMapColumn = SearchColumnByField(tsc._tables, tsc.currentTable, left) ?? 
 | 
					            var leftMapColumn = SearchColumnByField(tsc._tables, tsc.currentTable, left);
 | 
				
			||||||
                tsc.diymemexp?.ParseExpColumnResult; //group by emum -> MapType(string) #1727
 | 
					 | 
				
			||||||
            var isLeftMapType = leftMapColumn != null && new[] { "AND", "OR", "*", "/", "+", "-" }.Contains(oper) == false && (leftMapColumn.Attribute.MapType != rightExp.Type || leftMapColumn.CsType != rightExp.Type);
 | 
					            var isLeftMapType = leftMapColumn != null && new[] { "AND", "OR", "*", "/", "+", "-" }.Contains(oper) == false && (leftMapColumn.Attribute.MapType != rightExp.Type || leftMapColumn.CsType != rightExp.Type);
 | 
				
			||||||
            ColumnInfo rightMapColumn = null;
 | 
					            ColumnInfo rightMapColumn = null;
 | 
				
			||||||
            var isRightMapType = false;
 | 
					            var isRightMapType = false;
 | 
				
			||||||
@@ -873,7 +870,6 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                (leftMapColumn.Table.AsTableColumn == leftMapColumn && rightExp.IsParameter() == false)) ? //自动分表
 | 
					                (leftMapColumn.Table.AsTableColumn == leftMapColumn && rightExp.IsParameter() == false)) ? //自动分表
 | 
				
			||||||
                formatSql(Expression.Lambda(rightExp).Compile().DynamicInvoke(), leftMapColumn.Attribute.MapType, leftMapColumn, tsc.dbParams) :
 | 
					                formatSql(Expression.Lambda(rightExp).Compile().DynamicInvoke(), leftMapColumn.Attribute.MapType, leftMapColumn, tsc.dbParams) :
 | 
				
			||||||
                ExpressionLambdaToSql(rightExp, tsc);
 | 
					                ExpressionLambdaToSql(rightExp, tsc);
 | 
				
			||||||
            if (isLeftMapType) tsc.SetMapTypeReturnOld(leftMapColumn.Attribute.MapType);
 | 
					 | 
				
			||||||
            if (right != "NULL" && isLeftMapType &&
 | 
					            if (right != "NULL" && isLeftMapType &&
 | 
				
			||||||
                //判断参数化后的bug
 | 
					                //判断参数化后的bug
 | 
				
			||||||
                !(right.Contains('@') || right.Contains('?') || right.Contains(':')) &&
 | 
					                !(right.Contains('@') || right.Contains('?') || right.Contains(':')) &&
 | 
				
			||||||
@@ -900,7 +896,6 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                        (rightMapColumn.Table.AsTableColumn == rightMapColumn && leftExp.IsParameter() == false)) ? //自动分表
 | 
					                        (rightMapColumn.Table.AsTableColumn == rightMapColumn && leftExp.IsParameter() == false)) ? //自动分表
 | 
				
			||||||
                        formatSql(Expression.Lambda(leftExp).Compile().DynamicInvoke(), rightMapColumn.Attribute.MapType, rightMapColumn, tsc.dbParams) :
 | 
					                        formatSql(Expression.Lambda(leftExp).Compile().DynamicInvoke(), rightMapColumn.Attribute.MapType, rightMapColumn, tsc.dbParams) :
 | 
				
			||||||
                        ExpressionLambdaToSql(leftExp, tsc);
 | 
					                        ExpressionLambdaToSql(leftExp, tsc);
 | 
				
			||||||
                    if (isRightMapType) tsc.SetMapTypeReturnOld(rightMapColumn.Attribute.MapType);
 | 
					 | 
				
			||||||
                    if (left != "NULL" && isRightMapType &&
 | 
					                    if (left != "NULL" && isRightMapType &&
 | 
				
			||||||
                        //判断参数化后的bug
 | 
					                        //判断参数化后的bug
 | 
				
			||||||
                        !(left.Contains('@') || left.Contains('?') || left.Contains(':')) &&
 | 
					                        !(left.Contains('@') || left.Contains('?') || left.Contains(':')) &&
 | 
				
			||||||
@@ -990,7 +985,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                case ExpressionType.Not:
 | 
					                case ExpressionType.Not:
 | 
				
			||||||
                    var notExp = (exp as UnaryExpression)?.Operand;
 | 
					                    var notExp = (exp as UnaryExpression)?.Operand;
 | 
				
			||||||
                    if (notExp.Type.IsNumberType())return _common.BitNot(ExpressionLambdaToSql(notExp, tsc)); //位操作
 | 
					                    if (notExp.Type.IsNumberType()) return _common.BitNot(ExpressionLambdaToSql(notExp, tsc)); //位操作
 | 
				
			||||||
                    if (notExp.NodeType == ExpressionType.MemberAccess)
 | 
					                    if (notExp.NodeType == ExpressionType.MemberAccess)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        var notBody = ExpressionLambdaToSql(notExp, tsc);
 | 
					                        var notBody = ExpressionLambdaToSql(notExp, tsc);
 | 
				
			||||||
@@ -2425,7 +2420,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                            new ReplaceParameterVisitor().Modify(fl.Where, newParameter),
 | 
					                            new ReplaceParameterVisitor().Modify(fl.Where, newParameter),
 | 
				
			||||||
                            newParameter
 | 
					                            newParameter
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
						var whereSql = ExpressionLambdaToSql(expExp.Body, new ExpTSC
 | 
					                        var whereSql = ExpressionLambdaToSql(expExp.Body, new ExpTSC
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            _tables = isMultitb ? new List<SelectTableInfo>(new[] { tb }) : null,
 | 
					                            _tables = isMultitb ? new List<SelectTableInfo>(new[] { tb }) : null,
 | 
				
			||||||
                            _selectColumnMap = null,
 | 
					                            _selectColumnMap = null,
 | 
				
			||||||
@@ -2596,7 +2591,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            if (matchIgnores.ContainsKey(typeProp)) continue;
 | 
					                            if (matchIgnores.ContainsKey(typeProp)) continue;
 | 
				
			||||||
                            matchIgnores.Add(typeProp, true);
 | 
					                            matchIgnores.Add(typeProp, true);
 | 
				
			||||||
							var nextExp = Expression.MakeMemberAccess(memExp, typeProp);
 | 
					                            var nextExp = Expression.MakeMemberAccess(memExp, typeProp);
 | 
				
			||||||
                            var ret = LocalMatch(typeProp.PropertyType, nextExp);
 | 
					                            var ret = LocalMatch(typeProp.PropertyType, nextExp);
 | 
				
			||||||
                            if (ret != null)
 | 
					                            if (ret != null)
 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
@@ -2765,8 +2760,8 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                    Type = SelectTableInfoType.Parent,
 | 
					                    Type = SelectTableInfoType.Parent,
 | 
				
			||||||
                    Parameter = a.Parameter
 | 
					                    Parameter = a.Parameter
 | 
				
			||||||
                }));
 | 
					                }));
 | 
				
			||||||
				if (dbParams != null) select.WithParameters(dbParams);
 | 
					                if (dbParams != null) select.WithParameters(dbParams);
 | 
				
			||||||
				if (tableRule != null) select._tableRules.Add(tableRule);
 | 
					                if (tableRule != null) select._tableRules.Add(tableRule);
 | 
				
			||||||
                if (whereGlobalFilter != null)
 | 
					                if (whereGlobalFilter != null)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    select._whereGlobalFilter.Clear();
 | 
					                    select._whereGlobalFilter.Clear();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,11 +36,9 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
        public override string ParseExp(Expression[] members)
 | 
					        public override string ParseExp(Expression[] members)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            ParseExpMapResult = null;
 | 
					            ParseExpMapResult = null;
 | 
				
			||||||
            ParseExpColumnResult = null;
 | 
					 | 
				
			||||||
            if (members.Any() == false)
 | 
					            if (members.Any() == false)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                ParseExpMapResult = _map;
 | 
					                ParseExpMapResult = _map;
 | 
				
			||||||
                ParseExpColumnResult = ParseExpMapResult.GetColumn();
 | 
					 | 
				
			||||||
                return _map.DbField;
 | 
					                return _map.DbField;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            var firstMember = ((members.FirstOrDefault() as MemberExpression)?.Expression as MemberExpression);
 | 
					            var firstMember = ((members.FirstOrDefault() as MemberExpression)?.Expression as MemberExpression);
 | 
				
			||||||
@@ -55,7 +53,6 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        if (read == null) return null;
 | 
					                        if (read == null) return null;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    ParseExpMapResult = read;
 | 
					                    ParseExpMapResult = read;
 | 
				
			||||||
                    ParseExpColumnResult = ParseExpMapResult.GetColumn();
 | 
					 | 
				
			||||||
                    if (!_addFieldAlias) return read.DbField;
 | 
					                    if (!_addFieldAlias) return read.DbField;
 | 
				
			||||||
                    if (_flagNestedFieldAlias) return read.DbField;
 | 
					                    if (_flagNestedFieldAlias) return read.DbField;
 | 
				
			||||||
                    if (_comonExp.EndsWithDbNestedField(read.DbField, read.DbNestedField) == false)
 | 
					                    if (_comonExp.EndsWithDbNestedField(read.DbField, read.DbNestedField) == false)
 | 
				
			||||||
@@ -85,7 +82,6 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                                members[a] = replaceVistor.Modify(members[a], replaceMember, curtable.Parameter);
 | 
					                                members[a] = replaceVistor.Modify(members[a], replaceMember, curtable.Parameter);
 | 
				
			||||||
                            var ret = _select._diymemexpWithTempQuery.ParseExp(members);
 | 
					                            var ret = _select._diymemexpWithTempQuery.ParseExp(members);
 | 
				
			||||||
                            ParseExpMapResult = _select._diymemexpWithTempQuery.ParseExpMapResult;
 | 
					                            ParseExpMapResult = _select._diymemexpWithTempQuery.ParseExpMapResult;
 | 
				
			||||||
                            ParseExpColumnResult = ParseExpMapResult.GetColumn();
 | 
					 | 
				
			||||||
                            return ret;
 | 
					                            return ret;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -134,10 +130,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                                return null;
 | 
					                                return null;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    var tsc = new CommonExpression.ExpTSC { _tables = _tables, _tableRule = _select._tableRule, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = true, style = CommonExpression.ExpressionStyle.Where };
 | 
					                    return _comonExp.ExpressionLambdaToSql(retExp, new CommonExpression.ExpTSC { _tables = _tables, _tableRule = _select._tableRule, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = true, style = CommonExpression.ExpressionStyle.Where });
 | 
				
			||||||
                    var result = _comonExp.ExpressionLambdaToSql(retExp, tsc);
 | 
					 | 
				
			||||||
                    ParseExpColumnResult = tsc.mapColumnTmp;
 | 
					 | 
				
			||||||
                    return result;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -238,7 +231,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
    public class SelectGroupingProvider<TKey, TValue> : SelectGroupingProvider, ISelectGrouping<TKey, TValue>
 | 
					    public class SelectGroupingProvider<TKey, TValue> : SelectGroupingProvider, ISelectGrouping<TKey, TValue>
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public SelectGroupingProvider(IFreeSql orm, Select0Provider select, ReadAnonymousTypeInfo map, string field, CommonExpression comonExp, List<SelectTableInfo> tables)
 | 
					        public SelectGroupingProvider(IFreeSql orm, Select0Provider select, ReadAnonymousTypeInfo map, string field, CommonExpression comonExp, List<SelectTableInfo> tables)
 | 
				
			||||||
            :base(orm, select, map, field, comonExp, tables) { }
 | 
					            : base(orm, select, map, field, comonExp, tables) { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public string ToSql<TReturn>(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, TReturn>> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex)
 | 
					        public string ToSql<TReturn>(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, TReturn>> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -262,7 +255,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            Select0Provider.WithTempQueryParser parser = null;
 | 
					            Select0Provider.WithTempQueryParser parser = null;
 | 
				
			||||||
            _addFieldAlias = true; //解决:[Column(Name = "flevel") 与属性名不一致时,嵌套查询 bug
 | 
					            _addFieldAlias = true; //解决:[Column(Name = "flevel") 与属性名不一致时,嵌套查询 bug
 | 
				
			||||||
            _flagNestedFieldAlias = true;//解决重复设置别名问题:.GroupBy((l, p) => new { p.ID, ShopType=l.ShopType??0 }).WithTempQuery(a => new { Money = a.Sum(a.Value.Item1.Amount)* a.Key.ShopType })
 | 
					            _flagNestedFieldAlias = true;//解决重复设置别名问题:.GroupBy((l, p) => new { p.ID, ShopType=l.ShopType??0 }).WithTempQuery(a => new { Money = a.Sum(a.Value.Item1.Amount)* a.Key.ShopType })
 | 
				
			||||||
			var old_field = _field;
 | 
					            var old_field = _field;
 | 
				
			||||||
            var fieldsb = new StringBuilder();
 | 
					            var fieldsb = new StringBuilder();
 | 
				
			||||||
            if (_map.Childs.Any() == false) fieldsb.Append(", ").Append(_map.DbField).Append(_comonExp.EndsWithDbNestedField(_map.DbField, _map.DbNestedField) ? "" : _comonExp._common.FieldAsAlias(_map.DbNestedField));
 | 
					            if (_map.Childs.Any() == false) fieldsb.Append(", ").Append(_map.DbField).Append(_comonExp.EndsWithDbNestedField(_map.DbField, _map.DbNestedField) ? "" : _comonExp._common.FieldAsAlias(_map.DbNestedField));
 | 
				
			||||||
            foreach (var child in _map.GetAllChilds())
 | 
					            foreach (var child in _map.GetAllChilds())
 | 
				
			||||||
@@ -279,7 +272,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                _field = old_field;
 | 
					                _field = old_field;
 | 
				
			||||||
                _addFieldAlias = false;
 | 
					                _addFieldAlias = false;
 | 
				
			||||||
                _flagNestedFieldAlias = false;
 | 
					                _flagNestedFieldAlias = false;
 | 
				
			||||||
			}
 | 
					            }
 | 
				
			||||||
            var sql = $"\r\n{this.ToSql(parser._insideSelectList[0].InsideField)}";
 | 
					            var sql = $"\r\n{this.ToSql(parser._insideSelectList[0].InsideField)}";
 | 
				
			||||||
            ret.WithSql(sql);
 | 
					            ret.WithSql(sql);
 | 
				
			||||||
            ret._diymemexpWithTempQuery = parser;
 | 
					            ret._diymemexpWithTempQuery = parser;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user