【问题标题】:Entity Framework - Where Clause实体框架 - Where 子句
【发布时间】:2011-12-31 17:03:37
【问题描述】:

假设我有一个名为 User 的表。 当我使用实体框架获取记录时,我会这样做:

var db = new Context();
var users = db.Users;

它返回我表中的所有用户。好的。如果我这样做:

var fooUsers = db.Users.Where(u => u.Name == 'foo');

它会给我所有名为“foo”的用户。好的。我的问题是: 实体框架进行如下查询:

select * from user where name = 'foo'

或者它加载所有用户并在服务器上使用 lambda 表达式过滤它们?

【问题讨论】:

    标签: asp.net asp.net-mvc-3 entity-framework lambda


    【解决方案1】:

    提交到您的数据库的 Sql 将包含您的 where 子句。您可以使用 SQL Server Profiler 观察查询是否提交到您的数据库。

    【讨论】:

    • +1 表示正确答案。谢谢加西克。我希望听到这个。
    【解决方案2】:

    Entity Framework 会将此类查询转换为“存储表达式”。也就是说,它将生成一个数据库查询——假设您的数据存储一个数据库——这将与您在问题中包含的查询有些相似。但是,它可以很好地命名列,并且可能存在一些其他差异。

    【讨论】:

      【解决方案3】:

      从这里http://msdn.microsoft.com/en-us/library/cc853327.aspx

      当您创建 ObjectQuery 或 LINQ 查询时,查询可能不会立即执行。查询执行被推迟到需要结果时,例如在 foreach (C#) 或 For Each (Visual Basic) 枚举期间或分配给填充 List 集合时。当您在 ObjectQuery 上调用 Execute 方法或调用返回单例查询(如 First 或 Any)的 LINQ 方法时,查询执行立即开始。有关详细信息,请参阅对象查询和查询执行 (LINQ to Entities)。

      因此,当您的查询有 WHERE 子句时,它只会加载由数据库过滤的带有 where 的结果。

      【讨论】:

        猜你喜欢
        • 2011-10-21
        • 2010-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多