繁体   English   中英

为什么在LINQ中使用“select new”

[英]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之上构建一个文件系统。 这些领域是:

  • filename VARCHAR(100)
  • 数据BLOB

现在您要读取文件列表。 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)binaryxml数据类型),我们可能希望从查询中排除这些数据类型。

如果您要select o ,那么您将选择包含其所有属性和行为的Order

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM