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子句)查询表的最佳做法是什么?
答案 0 :(得分:10)
ToList()调用将导致EF从数据库中取回所有用户记录。您对Where扩展方法的调用将针对内存中的set运行。如果更改了呼叫的顺序,它只会从数据库中选择所需的记录,如下所示:
db.Users.Where(x=>x.ExternalId == externalId).ToList();
这是因为实体框架使用延迟执行。在您的调用代码中枚举实际记录之前,不会调用数据库。在使用结果之前,查询只是一个等待执行的表达式树。如果你看看Where()方法,它的返回类型是IQueryable。当您调用ToList()时,您实际上是从表达式树(IQueryable)转换为通用的用户列表。这需要EF运行db查询以返回结果。