0

这有效:

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");

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

4

2 回答 2

1

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

于 2012-05-17T12:40:49.270 回答
0

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

于 2012-05-17T12:42:40.290 回答