- 修复 WithTempQuery + FromQuery + 子查询的 bug;

This commit is contained in:
2881099
2022-09-05 20:03:39 +08:00
parent f601d9b9e0
commit 9eab104259
3 changed files with 77 additions and 19 deletions

View File

@ -1637,6 +1637,80 @@ WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name02' OR a.[Nickname] = N'name03
Assert.Equal(1, list15[1].rownum);
Assert.Equal(5, list15[1].user.Id);
Assert.Equal("name03", list15[1].user.Nickname);
var sql16 = fsql.Select<TwoTablePartitionBy_User>()
.WithTempQuery(a => new
{
user = a,
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
})
.Where(a => a.rownum == 1)
.FromQuery(fsql.Select<TwoTablePartitionBy_UserExt>().Where(b => b.UserId > 0)
.GroupBy(b => new { b.UserId, b.Remark })
.WithTempQuery(b => new { b.Key, sum1 = b.Sum(b.Value.UserId) }))
.InnerJoin((a, b) => a.user.Id == b.Key.UserId)
.Where((a, b) => a.user.Nickname == "name02" || a.user.Nickname == "name03")
.ToSql((a, b) => new
{
user = a.user,
rownum = a.rownum,
groupby = b,
subquery1 = fsql.Select<TwoTablePartitionBy_UserDto>().Where(c => c.Id == a.user.Id).Count(),
subquery2 = fsql.Select<TwoTablePartitionBy_UserDto>().Where(c => c.Id == b.Key.UserId).Count(),
}, FieldAliasOptions.AsProperty);
var assertSql16 = @"SELECT a.[Id], a.[Nickname], a.[rownum], b.[UserId], b.[Remark], b.[sum1], (SELECT count(1)
FROM [TwoTablePartitionBy_UserDto] c
WHERE (c.[Id] = a.[Id])) [subquery1], (SELECT count(1)
FROM [TwoTablePartitionBy_UserDto] c
WHERE (c.[Id] = b.[UserId])) [subquery2]
FROM (
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum]
FROM [TwoTablePartitionBy_User] a ) a
INNER JOIN (
SELECT a.[UserId], a.[Remark], sum(a.[UserId]) [sum1]
FROM [TwoTablePartitionBy_UserExt] a
WHERE (a.[UserId] > 0)
GROUP BY a.[UserId], a.[Remark] ) b ON a.[Id] = b.[UserId]
WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name02' OR a.[Nickname] = N'name03'))";
Assert.Equal(sql16, assertSql16);
var list16 = fsql.Select<TwoTablePartitionBy_User>()
.WithTempQuery(a => new
{
user = a,
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
})
.Where(a => a.rownum == 1)
.FromQuery(fsql.Select<TwoTablePartitionBy_UserExt>().Where(b => b.UserId > 0)
.GroupBy(b => new { b.UserId, b.Remark })
.WithTempQuery(b => new { b.Key, sum1 = b.Sum(b.Value.UserId) }))
.InnerJoin((a, b) => a.user.Id == b.Key.UserId)
.Where((a, b) => a.user.Nickname == "name02" || a.user.Nickname == "name03")
.ToList((a, b) => new
{
user = a.user,
rownum = a.rownum,
groupby = b,
subquery1 = fsql.Select<TwoTablePartitionBy_UserDto>().Where(c => c.Id == a.user.Id).Count(),
subquery2 = fsql.Select<TwoTablePartitionBy_UserDto>().Where(c => c.Id == b.Key.UserId).Count(),
});
Assert.Equal(list16.Count, 2);
Assert.Equal("remark04", list16[0].groupby.Key.Remark);
Assert.Equal(4, list16[0].groupby.Key.UserId);
Assert.Equal(4, list16[0].groupby.sum1);
Assert.Equal(1, list16[0].rownum);
Assert.Equal(4, list16[0].user.Id);
Assert.Equal("name02", list16[0].user.Nickname);
Assert.Equal(0, list16[0].subquery1);
Assert.Equal(0, list16[0].subquery2);
Assert.Equal("remark05", list16[1].groupby.Key.Remark);
Assert.Equal(5, list16[1].groupby.Key.UserId);
Assert.Equal(5, list16[1].groupby.sum1);
Assert.Equal(1, list16[1].rownum);
Assert.Equal(5, list16[1].user.Id);
Assert.Equal("name03", list16[1].user.Nickname);
Assert.Equal(0, list16[1].subquery1);
Assert.Equal(0, list16[1].subquery2);
}
class TwoTablePartitionBy_User
{