这两个EF查询有什么区别?哪个最好,为什么?

时间:2014-09-23 17:30:24

标签: c# linq entity-framework linq-to-entities entity-framework-5

EF中这两个查询之间有什么区别,哪个最好?为什么?

using (var context = new BloggingContext()) 
{ 
    var blogs = (from b in context.Blogs select b).ToList(); 

    var blogs = context.Blogs.ToList(); 
}

3 个答案:

答案 0 :(得分:2)

我相信你的问题是关于方法语法与查询语法。您的第一个查询基于查询语法,第二个查询基于方法语法。

请参阅:Query Syntax and Method Syntax in LINQ (C#)

  

介绍语言集成查询(LINQ)中的大多数查询   文档是使用LINQ声明性查询语法编写的。   但是,必须将查询语法转换为方法调用   编译代码时的.NET公共语言运行库(CLR)。

编辑: 使用已编辑的代码段,执行时两个查询之间没有区别。您的第一个查询基于查询语法,该语法将编译为方法语法(您的第二个查询)。在这两者之间进行选择是一个选择问题。我个人发现方法语法更具可读性。

旧答案:


但是,您的两个查询之间存在重大差异。您的第一个查询只是一个查询构造,它还没有被执行,考虑到您已经标记了实体框架,您的第一个查询不会从内存中带来数据库中的任何记录。要迭代结果集,您需要ToList()ToArray()等。

您的第二个查询实际上是从您的表中获取所有记录并加载到内存中的List<T>对象中。

另见:Deferred query execution

  

在返回值序列的查询中,查询变量   本身永远不会保存查询结果,只存储查询   命令。查询的执行将延迟到查询变量   在foreach或For Each循环中迭代。这被称为   延期执行;也就是说,查询执行发生在一段时间之后   构造了查询。这意味着您可以执行查询   经常如你所愿。例如,当你有这个时,这很有用   由其他应用程序更新的数据库。在你的   应用程序,您可以创建查询以检索最新信息   并重复执行查询,返回更新的信息   每一次。

答案 1 :(得分:1)

完全同意@Habib正确答案@Habib提供

请记住我是从@Habib

复制的

我相信你的问题是关于方法语法与查询语法。您的第一个查询基于查询语法,第二个查询基于方法语法。

请参阅:Query Syntax and Method Syntax in LINQ (C#)

介绍性语言集成查询(LINQ)文档中的大多数查询都是使用LINQ声明性查询语法编写的。但是,在编译代码时,必须将查询语法转换为.NET公共语言运行库(CLR)的方法调用。

编辑:使用您编辑的代码段,执行时两个查询之间没有区别。您的第一个查询基于查询语法,该语法将编译为方法语法(您的第二个查询)。在这两者之间进行选择是一个选择问题。我个人发现方法语法更具可读性。

答案 2 :(得分:0)

第一个查询没有执行任何操作,您只是构建查询。

第二个查询从DB中提取所有博客记录并将其加载到内存中。

哪个最好取决于您的需求。

编辑:如果您要求语法,则没有区别。编译器会将查询语法编译为扩展方法调用。

除此之外,还有:

from b in context.Blogs select b

有点毫无意义。它与context.Blogs.Select(x => x)等同。所以在这种情况下,我会选择context.Blogs.ToList();

相关问题