- 优化 WithTempQuery + ToList 使用子查询;

This commit is contained in:
2881099 2023-03-02 19:48:34 +08:00
parent df3073819d
commit a7c3783e8a
6 changed files with 38 additions and 5 deletions

View File

@ -864,9 +864,10 @@ namespace base_entity
var testsublist2 = fsql.Select<UserGroup>() var testsublist2 = fsql.Select<UserGroup>()
.GroupBy(a => new { a.Id }) .GroupBy(a => new { a.Id })
.WithTempQuery(a => a.Key)
.First(a => new .First(a => new
{ {
a.Id, id = a,
list = userRepository.Select.Where(b => b.GroupId == a.Id).ToList(), list = userRepository.Select.Where(b => b.GroupId == a.Id).ToList(),
list2 = userRepository.Select.Where(b => b.GroupId == a.Id).ToList(b => b.Nickname), list2 = userRepository.Select.Where(b => b.GroupId == a.Id).ToList(b => b.Nickname),
}); });

View File

@ -733,6 +733,15 @@
<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&lt;T&gt;的配置类
</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>
创建普通数据上下文档对象 创建普通数据上下文档对象
@ -791,5 +800,14 @@
<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>

View File

@ -2720,6 +2720,14 @@
<param name="select">选择列</param> <param name="select">选择列</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.ISelectGrouping`2.First``1(System.Linq.Expressions.Expression{System.Func{FreeSql.ISelectGroupingAggregate{`0,`1},``0}})">
<summary>
执行SQL查询返回指定字段的记录的第一条记录记录不存在时返回 TReturn 默认值
</summary>
<typeparam name="TReturn"></typeparam>
<param name="select"></param>
<returns></returns>
</member>
<member name="M:FreeSql.ISelectGrouping`2.Select``1(System.Linq.Expressions.Expression{System.Func{FreeSql.ISelectGroupingAggregate{`0,`1},``0}})"> <member name="M:FreeSql.ISelectGrouping`2.Select``1(System.Linq.Expressions.Expression{System.Func{FreeSql.ISelectGroupingAggregate{`0,`1},``0}})">
<summary> <summary>
【linq to sql】专用方法不建议直接使用 【linq to sql】专用方法不建议直接使用

View File

@ -955,12 +955,12 @@ namespace FreeSql.Internal
return $"not({ExpressionLambdaToSql(notExp, tsc)})"; return $"not({ExpressionLambdaToSql(notExp, tsc)})";
case ExpressionType.Quote: return ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, tsc); case ExpressionType.Quote: return ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, tsc);
case ExpressionType.Lambda: return ExpressionLambdaToSql((exp as LambdaExpression)?.Body, tsc); case ExpressionType.Lambda: return ExpressionLambdaToSql((exp as LambdaExpression)?.Body, tsc);
//case ExpressionType.Invoke: return formatSql(Expression.Lambda(exp).Compile().DynamicInvoke(), tsc.mapType, tsc.mapColumnTmp, tsc.dbParams); case ExpressionType.Invoke: //#1378
case ExpressionType.Invoke:
var invokeExp = exp as InvocationExpression; var invokeExp = exp as InvocationExpression;
var invokeReplaceVistor = new FreeSql.Internal.CommonExpression.ReplaceVisitor();
var invokeReplaceExp = invokeExp.Expression; var invokeReplaceExp = invokeExp.Expression;
var invokeLambdaExp = invokeReplaceExp as LambdaExpression; var invokeLambdaExp = invokeReplaceExp as LambdaExpression;
if (invokeLambdaExp == null) return formatSql(Expression.Lambda(exp).Compile().DynamicInvoke(), tsc.mapType, tsc.mapColumnTmp, tsc.dbParams);
var invokeReplaceVistor = new FreeSql.Internal.CommonExpression.ReplaceVisitor();
var len = Math.Min(invokeExp.Arguments.Count, invokeLambdaExp.Parameters.Count); var len = Math.Min(invokeExp.Arguments.Count, invokeLambdaExp.Parameters.Count);
for (var a = 0; a < len; a++) for (var a = 0; a < len; a++)
invokeReplaceExp = invokeReplaceVistor.Modify(invokeReplaceExp, invokeLambdaExp.Parameters[a], invokeExp.Arguments[a]); invokeReplaceExp = invokeReplaceVistor.Modify(invokeReplaceExp, invokeLambdaExp.Parameters[a], invokeExp.Arguments[a]);

View File

@ -493,6 +493,12 @@ namespace FreeSql.Internal.CommonProvider
var tb = _select._tables.Find(a => a.Parameter == firstExp)?.Table; var tb = _select._tables.Find(a => a.Parameter == firstExp)?.Table;
if (tb == null) return base.VisitMember(node); if (tb == null) return base.VisitMember(node);
if (tb.Columns.Any() == false && _select._diymemexpWithTempQuery != null) //匿名类,嵌套查询 DTO
{
Result.Add(NativeTuple.Create(node, default(ColumnInfo)));
return node;
}
while (exps.Any()) while (exps.Any())
{ {
var memExp = exps.Pop() as MemberExpression; var memExp = exps.Pop() as MemberExpression;