mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	- 修复 子查询内使用嵌套查询的 bug;
This commit is contained in:
		@@ -71,7 +71,7 @@ WHERE (((a.[Id]) in (SELECT DISTINCT v.[Id]
 | 
			
		||||
        SELECT ht1.[IsDeleted], ht1.[Id], ht1.[No], ht1.[Date], ht2.[Quantity], isnull((SELECT sum(ti2.[Quantity]) 
 | 
			
		||||
            FROM [bie_2] ti2 
 | 
			
		||||
            WHERE (ti2.[RefHeadId] = ht2.[HeadId] AND ti2.[RefItemId] = ht2.[Id])), 0) [RefQuantity] 
 | 
			
		||||
        FROM [BaseHeadEntity] ht1 
 | 
			
		||||
        FROM [bhe_1] ht1 
 | 
			
		||||
        INNER JOIN ( 
 | 
			
		||||
            SELECT bi.[IsDeleted], bi.[Id], bi.[HeadId], bi.[GoodsId], bi.[Quantity], bi.[RefHeadId], bi.[RefItemId] 
 | 
			
		||||
            FROM [bie_1] bi 
 | 
			
		||||
@@ -79,6 +79,43 @@ WHERE (((a.[Id]) in (SELECT DISTINCT v.[Id]
 | 
			
		||||
        WHERE (bh.[IsDeleted] = 0) ) v 
 | 
			
		||||
    WHERE (v.[RefQuantity] < v.[Quantity])))) 
 | 
			
		||||
ORDER BY a.[Date] DESC", sql2);
 | 
			
		||||
 | 
			
		||||
            var sql3 = fsql.Select<BaseHeadEntity>().AsType(typeof(BhEntity1))
 | 
			
		||||
                .FromQuery(
 | 
			
		||||
                    fsql.Select<BaseHeadEntity>().AsType(typeof(BhEntity1)).Where(bh => bh.IsDeleted == false)
 | 
			
		||||
                        .FromQuery(fsql.Select<BaseItemEntity>().AsType(typeof(BiEntity1)).As("bi").Where(bi => bi.IsDeleted == false))
 | 
			
		||||
                        .InnerJoin(v => v.t1.Id == v.t2.HeadId)
 | 
			
		||||
                        .WithTempQuery(v => new
 | 
			
		||||
                        {
 | 
			
		||||
                            BillHead = v.t1,
 | 
			
		||||
                            Quantity = v.t2.Quantity,
 | 
			
		||||
                            RefQuantity = fsql.Select<BaseItemEntity>().AsType(typeof(BiEntity2)).As("bi2")
 | 
			
		||||
                                .Where(ti2 => ti2.RefHeadId == v.t2.HeadId && ti2.RefItemId == v.t2.Id)
 | 
			
		||||
                                .Sum(ti2 => ti2.Quantity),
 | 
			
		||||
                        })
 | 
			
		||||
                        .Where(v => v.RefQuantity < v.Quantity)
 | 
			
		||||
                        .Distinct()
 | 
			
		||||
                        .WithTempQuery(v => new { v.BillHead.Id })
 | 
			
		||||
                )
 | 
			
		||||
                .RightJoin(v => v.t1.Id == v.t2.Id)
 | 
			
		||||
                .OrderByDescending(v => v.t1.Date)
 | 
			
		||||
                .ToSql();
 | 
			
		||||
            Assert.Equal(@"SELECT * 
 | 
			
		||||
FROM [bhe_1] a 
 | 
			
		||||
RIGHT JOIN ( 
 | 
			
		||||
    SELECT DISTINCT a.[Id] 
 | 
			
		||||
    FROM ( 
 | 
			
		||||
        SELECT a.[IsDeleted], a.[Id], a.[No], a.[Date], htb.[Quantity], isnull((SELECT sum(ti2.[Quantity]) 
 | 
			
		||||
            FROM [bie_2] ti2 
 | 
			
		||||
            WHERE (ti2.[RefHeadId] = htb.[HeadId] AND ti2.[RefItemId] = htb.[Id])), 0) [RefQuantity] 
 | 
			
		||||
        FROM [bhe_1] a 
 | 
			
		||||
        INNER JOIN ( 
 | 
			
		||||
            SELECT bi.[IsDeleted], bi.[Id], bi.[HeadId], bi.[GoodsId], bi.[Quantity], bi.[RefHeadId], bi.[RefItemId] 
 | 
			
		||||
            FROM [bie_1] bi 
 | 
			
		||||
            WHERE (bi.[IsDeleted] = 0)) htb ON a.[Id] = htb.[HeadId] 
 | 
			
		||||
        WHERE (a.[IsDeleted] = 0) ) a 
 | 
			
		||||
    WHERE (a.[RefQuantity] < a.[Quantity]) ) htb ON a.[Id] = htb.[Id] 
 | 
			
		||||
ORDER BY a.[Date] DESC;", sql3);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
 
 | 
			
		||||
@@ -1083,13 +1083,6 @@ namespace FreeSql.Internal
 | 
			
		||||
                            case "Min": return $"min({ExpressionLambdaToSql(exp3.Arguments[0], tsc)})";
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    if (callType.FullName.StartsWith("FreeSql.ISelectGrouping`"))
 | 
			
		||||
                    {
 | 
			
		||||
                        switch (exp3.Method.Name)
 | 
			
		||||
                        {
 | 
			
		||||
                            case "ToList": return "";
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    if (callType.FullName.StartsWith("FreeSql.ISelect`"))
 | 
			
		||||
                    { //子表查询
 | 
			
		||||
                        switch (exp3.Method.Name)
 | 
			
		||||
@@ -2268,7 +2261,9 @@ namespace FreeSql.Internal
 | 
			
		||||
            public LambdaExpression Modify(LambdaExpression lambda, List<SelectTableInfo> tables)
 | 
			
		||||
            {
 | 
			
		||||
                this.tables = tables.Where(a => a.Type != SelectTableInfoType.Parent).ToList();
 | 
			
		||||
                parameters = this.tables.Select(a => a.Parameter ?? Expression.Parameter(a.Table.Type, a.Alias)).ToArray();
 | 
			
		||||
                parameters = this.tables.Select(a => a.Parameter ?? 
 | 
			
		||||
                    Expression.Parameter(a.Table.Type, 
 | 
			
		||||
                        a.Alias.StartsWith("SP10") ? a.Alias.Replace("SP10", "ht") : a.Alias)).ToArray();
 | 
			
		||||
                var exp = Visit(lambda.Body);
 | 
			
		||||
                return Expression.Lambda(exp, parameters);
 | 
			
		||||
            }
 | 
			
		||||
@@ -2282,13 +2277,21 @@ namespace FreeSql.Internal
 | 
			
		||||
                    if (parent.Expression?.NodeType == ExpressionType.Parameter &&
 | 
			
		||||
                        parent.Expression.Type.Name.StartsWith("HzyTuple`") == true &&
 | 
			
		||||
                        int.TryParse(parent.Member.Name.Replace("t", ""), out widx) && widx > 0 && widx <= tables.Count)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (parameters[widx - 1].Type != parent.Type) //解决 BaseEntity + AsTable 时报错
 | 
			
		||||
                            parameters[widx - 1] = Expression.Parameter(parent.Type, parameters[widx - 1].Name);
 | 
			
		||||
                        return Expression.Property(parameters[widx - 1], node.Member.Name);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (node.Expression?.NodeType == ExpressionType.Parameter &&
 | 
			
		||||
                    node.Expression.Type.Name.StartsWith("HzyTuple`") == true &&
 | 
			
		||||
                    int.TryParse(node.Member.Name.Replace("t", ""), out widx) && widx > 0 && widx <= tables.Count)
 | 
			
		||||
                {
 | 
			
		||||
                    if (parameters[widx - 1].Type != node.Type) //解决 BaseEntity + AsTable 时报错
 | 
			
		||||
                        parameters[widx - 1] = Expression.Parameter(node.Type, parameters[widx - 1].Name);
 | 
			
		||||
                    return parameters[widx - 1];
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return base.VisitMember(node);
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -93,23 +93,18 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
 | 
			
		||||
            if (lambParms == null)
 | 
			
		||||
            {
 | 
			
		||||
                var fromTables = from._tables.Where(a => a.Type == SelectTableInfoType.Parent).ToList();
 | 
			
		||||
                if (fromTables.Count > 0)
 | 
			
		||||
                {
 | 
			
		||||
                    to._tables = new List<SelectTableInfo>(to._tables);
 | 
			
		||||
                    to._tables.AddRange(fromTables);
 | 
			
		||||
                }
 | 
			
		||||
                var fromParentTables = from._tables.Where(a => a.Type == SelectTableInfoType.Parent).ToList();
 | 
			
		||||
                var fromTables = fromParentTables.Any() ? from._tables.Where(a => a.Type != SelectTableInfoType.Parent).ToList() : from._tables;
 | 
			
		||||
                if (to._tables.Count <= fromTables.Count)
 | 
			
		||||
                    to._tables = new List<SelectTableInfo>(fromTables);
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    if (to._tables.Count <= from._tables.Count)
 | 
			
		||||
                        to._tables = new List<SelectTableInfo>(from._tables.ToArray());
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        to._tables = new List<SelectTableInfo>(to._tables);
 | 
			
		||||
                        for (var a = 0; a < from._tables.Count; a++)
 | 
			
		||||
                            to._tables[a] = from._tables[a];
 | 
			
		||||
                    }
 | 
			
		||||
                    to._tables = new List<SelectTableInfo>(to._tables);
 | 
			
		||||
                    for (var a = 0; a < fromTables.Count; a++)
 | 
			
		||||
                        to._tables[a] = fromTables[a];
 | 
			
		||||
                }
 | 
			
		||||
                if (fromParentTables.Any())
 | 
			
		||||
                    to._tables.AddRange(fromParentTables);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user