3
class User {
    public int Id {set;get;}
    public int ExternalId {set;get;}
}

我已经定义了这个类。我使用代码优先EF。

public class FooContext : DbContext {
    public DbSet<User> Users { set; get; }
}

因此,当我执行以下操作时:

db.Users.ToList().where(x=>x.ExternalId == externalId);

我很好奇这是否会执行以下操作:

select whatever from Users where ExternalId = 'id I passed in';

还是将所有用户加载到内存中并在内存中执行 Linq?

使用条件(where 子句)查询表的最佳做法是什么?

4

1 回答 1

10

ToList() 调用将导致 EF 从数据库中提取所有用户记录。您对 Where 扩展方法的调用将针对内存中的集合运行。如果您更改调用顺序,它只会从数据库中选择所需的记录,如下所示:

db.Users.Where(x=>x.ExternalId == externalId).ToList();

这是因为实体框架使用延迟执行。在调用代码中枚举实际记录之前,不会调用数据库。在您使用结果之前,查询只是等待执行的表达式树。如果您查看 Where() 方法,它的返回类型是 IQueryable。当您调用 ToList() 时,您实际上是从表达式树 (IQueryable) 转换为通用用户列表。这需要 EF 运行 db 查询以返回结果。

于 2012-07-13T03:26:11.783 回答