Entity framework 不考虑延迟计算的实体框架

Entity framework 不考虑延迟计算的实体框架,entity-framework,Entity Framework,这项工作: var user = db.Users.OrderByDescending(u => u.Id).FirstOrDefault(u => u.Email == "asd@gmail.com" && u.Password == "8a79hjhfas8d7fd89"); 它正确地生成只返回一个用户的sql语句 下面的代码在理论上是相同的,它将所有用户从数据库中带出,并且只在之后应用过滤器。它的工作原理就像我在执行一个.ToList(),从而评估数据库中的所

这项工作:

var user = db.Users.OrderByDescending(u => u.Id).FirstOrDefault(u => u.Email == "asd@gmail.com" && u.Password == "8a79hjhfas8d7fd89");
它正确地生成只返回一个用户的sql语句

下面的代码在理论上是相同的,它将所有用户从数据库中带出,并且只在之后应用过滤器。它的工作原理就像我在执行一个.ToList(),从而评估数据库中的所有内容,并在常规IEnumerable中应用过滤器,而不是生成正确的sql语句:

public static User Get(Func<User, bool> predicate)
{
  return db.Users.OrderByDescending(u => u.Id).FirstOrDefault(predicate);
}

var user = User.Get(u => u.Email == "asd@gmail.com" && u.Password == "8a79hjhfas8d7fd89");
公共静态用户Get(Func谓词)
{
返回db.Users.OrderByDescending(u=>u.Id).FirstOrDefault(谓词);
}
var user=user.Get(u=>u.Email==”asd@gmail.com“&&u.密码==”8a79hjhfas8d7fd89“;

这是实体框架上的错误还是我遗漏了什么?

您正在传递一个
Func
,它是一个已编译的委托。相反,您应该传入一个
表达式作为Get参数,这是一个语法树,EF可以从中分析和生成查询,而不是对每个结果执行委托方法。

EF不知道如何将任意Func委托转换为SQL,因此,它别无选择,只能加载整个数据集,然后在该结果集上运行谓词