【问题标题】:How to query by where clause with EF code first如何先用 EF 代码通过 where 子句查询
【发布时间】:2012-07-12 21:37:08
【问题描述】:
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 子句)查询表的最佳做法是什么?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我没有使用 .ToList(),而是使用了 .First(),因为我只想找到第一条记录。
    猜你喜欢
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2019-06-16
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多