实体框架查询(?)

时间:2018-06-07 01:39:57

标签: c# entity-framework

我是Entity Framework的新手,我只是想知道这两个代码行之间有什么区别:

using (dbStudentEntities db = new dbStudentEntities())
{
    var classList = (from cl in db.tblClasses
                     select cl.className).ToList();

    var classList2 = db.tblClasses.Select(clss => clss.className);
}

它返回相同的结果。但他们叫什么?什么更好用?

4 个答案:

答案 0 :(得分:0)

在您使用该语言的查询运算符使用表达式语法的第一个示例中。编译器会将其转换为使用函数调用。这是个人喜好的问题。

classList将为List<T>,其中classList2IQueryable<T>

答案 1 :(得分:0)

第一个查询是Linq query。由于您向其添加了.ToList(),因此会产生一个List输出

第二个查询是Lambda expression,因为它最终没有任何.ToList(),因此会产生IQueryable<T>IQueryable<T>可用于进一步添加子句,而无需针对数据库触发查询。

答案 2 :(得分:0)

使用Linq表达式和Fluent点表示法之间的开发人员偏好是一个问题。

但是,两个表达式都将返回一个IQueryable<T>对象作为准备,直到你调用其他Linq扩展ToList,它将强制执行SQL语句回到数据库。

我更喜欢使用点符号来表示代码的可读性,并使用其他Linq表达式的基础方法调用。

希望这有帮助!

答案 3 :(得分:0)

以下表达式

from item in items select item

这个表达的语法糖

items.Select(item => item)

语法格式在编译时直接转换为扩展方法格式。

但是,在您的示例中,只有其中一个语句使用ToList方法,因此该方法将枚举或执行查询,具体取决于itemsEnumerable还是{分别为{1}}。

至于哪个更好用,这主要是基于意见的。对我来说,我发现LINQ语法在进行连接时可以提供清晰度。我对大多数其他查询使用扩展方法语法。与两者一起玩,并在特定查询的上下文中查看哪一个对您有意义。通常,一种语法将使查询的意图比另一种更清晰。其他时候它没有任何区别。

虽然我们讨论的是主题,但值得注意的是,LINQ语法通过模式匹配对可用的扩展方法起作用。这意味着如果您尚未导入可接受的IQueryable<>扩展方法,则from x in xs select x将无效,因为语法将替换为该方法。更危险的是,您可以导入一组完全独立的扩展方法以匹配LINQ语法,只要这些方法签名与语法所期望的匹配即可。并且该功能也可以扩展到自定义类型,但我最近没有考虑过。