- 优化 导航属性集合 .Exists 效果与 .Any 相同;

This commit is contained in:
2881099 2022-11-08 19:03:09 +08:00
parent d2740e7cca
commit f3df5c7ec0
2 changed files with 18 additions and 2 deletions

View File

@ -800,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

@ -2502,7 +2502,7 @@ namespace FreeSql.Internal
if (whereGlobalFilter.Any()) select._whereGlobalFilter.AddRange(whereGlobalFilter); if (whereGlobalFilter.Any()) select._whereGlobalFilter.AddRange(whereGlobalFilter);
} }
} }
while (true) while (exp3Stack.Any())
{ {
var exp4 = exp3Stack.Pop(); var exp4 = exp3Stack.Pop();
if (exp4.NodeType == ExpressionType.MemberAccess) if (exp4.NodeType == ExpressionType.MemberAccess)
@ -2546,8 +2546,15 @@ namespace FreeSql.Internal
var callExp = exp4 as MethodCallExpression; var callExp = exp4 as MethodCallExpression;
switch (callExp.Method.Name) switch (callExp.Method.Name)
{ {
case "Exists":
case "Any": case "Any":
if (callExp.Arguments.Count == 2) if (callExp.Method.Name == "Exists" && callExp.Arguments.Count == 1 && callExp.Type.IsGenericType && callExp.Type.GetGenericTypeDefinition().IsAssignableFrom(typeof(IList<>)))
{
select._tables[0].Parameter = (callExp.Arguments[0] as LambdaExpression)?.Parameters.FirstOrDefault();
LocalSetSelectProviderAlias(select._tables[0].Parameter.Name);
select.InternalWhere(callExp.Arguments[0]);
}
if (callExp.Method.Name == "Any" && callExp.Arguments.Count == 2)
{ {
select._tables[0].Parameter = (callExp.Arguments[1] as LambdaExpression)?.Parameters.FirstOrDefault(); select._tables[0].Parameter = (callExp.Arguments[1] as LambdaExpression)?.Parameters.FirstOrDefault();
LocalSetSelectProviderAlias(select._tables[0].Parameter.Name); LocalSetSelectProviderAlias(select._tables[0].Parameter.Name);