Dar*_*der 3 c# linq entity-framework ef-code-first asp.net-mvc-3
class User {
public int Id {set;get;}
public int ExternalId {set;get;}
}
Run Code Online (Sandbox Code Playgroud)
我定义了这个类.我首先使用代码EF.
public class FooContext : DbContext {
public DbSet<User> Users { set; get; }
}
Run Code Online (Sandbox Code Playgroud)
所以当我做以下事情时:
db.Users.ToList().where(x=>x.ExternalId == externalId);
Run Code Online (Sandbox Code Playgroud)
我很好奇,如果这样做:
select whatever from Users where ExternalId = 'id I passed in';
Run Code Online (Sandbox Code Playgroud)
或者它将所有用户加载到内存并在内存中执行Linq?
查询具有条件(where子句)的表的最佳实践是什么?
Joe*_*one 10
ToList()调用将导致EF从数据库中取回所有用户记录.您对Where扩展方法的调用将针对内存中的set运行.如果更改了调用的顺序,它将只从db中选择所需的记录,如下所示:
db.Users.Where(x=>x.ExternalId == externalId).ToList();
Run Code Online (Sandbox Code Playgroud)
这是因为实体框架使用延迟执行.在您的调用代码中枚举实际记录之前,不会调用数据库.在使用结果之前,查询只是一个等待执行的表达式树.如果你看看Where()方法,它的返回类型是IQueryable.当您调用ToList()时,您实际上是从表达式树(IQueryable)转换为通用的用户列表.这需要EF运行db查询以返回结果.