如何首先使用EF代码通过where子句进行查询

时间:2012-07-13 03:17:19

标签: c# asp.net-mvc-3 linq entity-framework ef-code-first

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子句)查询表的最佳做法是什么?

1 个答案:

答案 0 :(得分:10)

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

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

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