【发布时间】:2019-10-02 10:35:53
【问题描述】:
因此,当您使用 EF Core 并使用大多数 Linq 扩展时,您实际上使用的是 System.Linq.Expressions 而不是通常的 Func。
假设您在DbSet 上使用FirstOrDefault。
DbContext.Foos.FirstOrDefault(x=> x.Bar == true);
当你在FirstOrDefault 上ctrl + lmb 时,它会显示以下重载:
public static TSource FirstOrDefault<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
但Func 也有过载:
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
当您想将表达式存储在变量中时,您可以执行以下操作:
Func<Entity, bool> = x => x.Bar == true;
和
Expression<Func<Entity, bool>> = x => x.Bar == true;
那么编译器如何决定在使用这些扩展方法时应该使用哪个重载呢?
【问题讨论】:
-
如果 func
作为 FirstAndDefault() 的输入参数,编译器只能使用 IEnumerable 重载,因为 func 无法转换为 SQL 以传递给数据库.这可能与此有关。 -
@DavidG 我猜这一般适用于.Net?
-
@Bensjero 好吧,这仍然没有意义。
-
我意识到我链接到 VB 文档而不是 C#。 C# 有它自己的规则。
标签: c# lambda entity-framework-core ef-core-3.0