为什么在LINQ中使用"select new"

Mar*_*hal 17 .net c# linq linq-to-sql

我对LINQ to SQL很新,所以请原谅我,如果它是一个外行问题.

我在许多地方看到我们"select new"在查询中使用关键字.例如

var orders =  from o in db.Orders select new {
                o.OrderID,
                 o.CustomerID,
                 o.EmployeeID,
                 o.ShippedDate
           }
Run Code Online (Sandbox Code Playgroud)

为什么我们不删除select new而只是使用 "select o"

var orders =  from o in db.Orders select o;
Run Code Online (Sandbox Code Playgroud)

我可以区分的是速度方面的性能差异,即第二次查询将比第一次查询花费更多的时间执行.

它们之间是否存在其他"差异"或"更好用"的概念?

xan*_*tos 30

使用new关键字,他们正在构建一个只包含这四个字段的匿名对象.也许Orders有1000个字段,它们只需要4个字段.

如果您在LINQ-to-SQL或Entity Framework(或其他类似的ORM)中执行SELECT它,它将构建并发送到SQL Server将只加载这4个字段(请注意,NHibernate不完全支持db的预测当你加载一个实体时,你必须完全加载它.在网络上传输的数据较少,并且该数据包含在索引中的可能性很小(从索引加载数据通常比从表中加载数据更快,因为该表可能有1000个字段,而索引可以包含这些数据4字段).

调用仅在SQL术语中选择某些列的操作PROJECTION.

具体案例:假设你在SQL之上构建一个文件系统.这些领域是:

  • filename VARCHAR(100)
  • 数据BLOB

现在您要读取文件列表.一个简单SELECT filename FROM files的SQL.data在你只需要的时候加载每个文件是没用的filename.请记住,该data部分可以"加权"兆字节,而该filename部分最多可达100个字符.

在阅读了new与匿名对象一起使用的"乐趣"之后,记得阅读@pleun已写的内容,并记住:ORM就像冰山一样:他们工作的7/8隐藏在表面之下并准备咬你.


Ple*_*eun 14

给出的答案很好,但我想补充另一个方面.

因为使用select new { },你会断开与datacontext的连接,这会让你失去 Linq-to-Sql 的变更跟踪机制.

因此,对于仅显示数据,它很好并且将导致性能提高.

但如果你想做更新,那就不行了.