我是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);
}
它返回相同的结果。但他们叫什么?什么更好用?
答案 0 :(得分:0)
在您使用该语言的查询运算符使用表达式语法的第一个示例中。编译器会将其转换为使用函数调用。这是个人喜好的问题。
classList
将为List<T>
,其中classList2
为IQueryable<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
方法,因此该方法将枚举或执行查询,具体取决于items
是Enumerable
还是{分别为{1}}。
至于哪个更好用,这主要是基于意见的。对我来说,我发现LINQ语法在进行连接时可以提供清晰度。我对大多数其他查询使用扩展方法语法。与两者一起玩,并在特定查询的上下文中查看哪一个对您有意义。通常,一种语法将使查询的意图比另一种更清晰。其他时候它没有任何区别。
虽然我们讨论的是主题,但值得注意的是,LINQ语法通过模式匹配对可用的扩展方法起作用。这意味着如果您尚未导入可接受的IQueryable<>
扩展方法,则from x in xs select x
将无效,因为语法将替换为该方法。更危险的是,您可以导入一组完全独立的扩展方法以匹配LINQ语法,只要这些方法签名与语法所期望的匹配即可。并且该功能也可以扩展到自定义类型,但我最近没有考虑过。