mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
- 修复 WithTempQuery + FromQuery + 子查询的 bug;
This commit is contained in:
parent
f601d9b9e0
commit
9eab104259
@ -733,15 +733,6 @@
|
|||||||
<param name="modelBuilder"></param>
|
<param name="modelBuilder"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:FreeSqlDbContextExtensions.ApplyConfigurationsFromAssembly(FreeSql.ICodeFirst,System.Reflection.Assembly,System.Func{System.Type,System.Boolean})">
|
|
||||||
<summary>
|
|
||||||
根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类
|
|
||||||
</summary>
|
|
||||||
<param name="codeFirst"></param>
|
|
||||||
<param name="assembly"></param>
|
|
||||||
<param name="predicate"></param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:FreeSqlDbContextExtensions.CreateDbContext(IFreeSql)">
|
<member name="M:FreeSqlDbContextExtensions.CreateDbContext(IFreeSql)">
|
||||||
<summary>
|
<summary>
|
||||||
创建普通数据上下文档对象
|
创建普通数据上下文档对象
|
||||||
@ -800,14 +791,5 @@
|
|||||||
<param name="that"></param>
|
<param name="that"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
|
|
||||||
<summary>
|
|
||||||
批量注入 Repository,可以参考代码自行调整
|
|
||||||
</summary>
|
|
||||||
<param name="services"></param>
|
|
||||||
<param name="globalDataFilter"></param>
|
|
||||||
<param name="assemblies"></param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
</members>
|
</members>
|
||||||
</doc>
|
</doc>
|
||||||
|
@ -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(1, list15[1].rownum);
|
||||||
Assert.Equal(5, list15[1].user.Id);
|
Assert.Equal(5, list15[1].user.Id);
|
||||||
Assert.Equal("name03", list15[1].user.Nickname);
|
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
|
class TwoTablePartitionBy_User
|
||||||
{
|
{
|
||||||
|
@ -1327,7 +1327,7 @@ namespace FreeSql.Internal
|
|||||||
//if (args[a] == null) ExpressionLambdaToSql(call3Exp.Arguments[a], fsqltables, null, null, SelectTableInfoType.From, true);
|
//if (args[a] == null) ExpressionLambdaToSql(call3Exp.Arguments[a], fsqltables, null, null, SelectTableInfoType.From, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var isSubSelectPdme = tsc._tables == null && tsc.diymemexp != null;
|
var isSubSelectPdme = tsc._tables == null && tsc.diymemexp != null || tsc.diymemexp is Select0Provider.WithTempQueryParser;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (isSubSelectPdme)
|
if (isSubSelectPdme)
|
||||||
@ -1735,6 +1735,8 @@ namespace FreeSql.Internal
|
|||||||
}
|
}
|
||||||
if (callExp != null) return ExpressionLambdaToSql(callExp, tsc);
|
if (callExp != null) return ExpressionLambdaToSql(callExp, tsc);
|
||||||
var diymemexps = new[] { tsc.diymemexp, tsc.subSelect001?._diymemexpWithTempQuery };
|
var diymemexps = new[] { tsc.diymemexp, tsc.subSelect001?._diymemexpWithTempQuery };
|
||||||
|
if (_subSelectParentDiyMemExps.Value?.Any() == true)
|
||||||
|
diymemexps = diymemexps.Concat(_subSelectParentDiyMemExps.Value).ToArray();
|
||||||
foreach (var diymemexp in diymemexps)
|
foreach (var diymemexp in diymemexps)
|
||||||
{
|
{
|
||||||
if (diymemexp != null)
|
if (diymemexp != null)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user