[英]Why use “select new ” in LINQ
我对LINQ to SQL很新,所以请原谅我,如果它是一个外行问题。
我在许多地方看到我们在查询中使用"select new"
关键字。 例如
var orders = from o in db.Orders select new {
o.OrderID,
o.CustomerID,
o.EmployeeID,
o.ShippedDate
}
为什么我们不删除select new,只使用"select o"
var orders = from o in db.Orders select o;
我可以区分的是速度方面的性能差异,即第二次查询将比第一次查询花费更多的时间执行。
它们之间是否存在其他“差异”或“更好用”的概念?
使用new
关键字,他们正在构建一个只包含这四个字段的匿名对象。 也许Orders有1000个字段,它们只需要4个字段。
如果您在LINQ-to-SQL或Entity Framework(或其他类似的ORM)中执行它,它将构建并发送到SQL Server的SELECT
将仅加载这4个字段(请注意,NHibernate并不完全支持在db level。加载实体时,必须完全加载它。 在网络上传输的数据较少并且此数据包含在索引中的可能性很小(从索引加载数据通常比从表中加载数据更快,因为该表可能有1000个字段,而索引可以包含这些数据4字段)。
在SQL术语中仅选择一些列的操作称为PROJECTION
。
具体案例:假设你在SQL之上构建一个文件系统。 这些领域是:
现在您要读取文件列表。 SQL中的一个简单的SELECT filename FROM files
。 在只需要filename
时加载每个文件的data
是没用的。 请记住, data
部分可以“加权”兆字节,而filename
部分最多可以包含100个字符。
在阅读了匿名对象使用new
之后有多么“有趣”之后,记得阅读@pleun
写的内容,并记住:ORM就像冰山一样:他们工作的7/8隐藏在表面之下并准备咬你。
给出的答案很好,但我想补充另一个方面。
因为,使用select new { }
,您断开与datacontext的连接,这使您失去了 Linq-to-Sql 的更改跟踪机制 。
因此,对于仅显示数据,它很好并且将导致性能提高。
但如果你想做更新,那就不行了。
在select new
,我们创建了一个只包含您需要的属性的新匿名类型。 他们都会从匹配的订单中获取属性名称和值。 当您不想从源中撤回所有属性时,这很有用。 有些可能很大(想想varchar(max)
, binary
或xml
数据类型),我们可能希望从查询中排除这些数据类型。
如果您要select o
,那么您将选择包含其所有属性和行为的Order
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.