gpt4 book ai didi

c# - 为什么在 LINQ 中使用 "select new "

转载 作者:IT王子 更新时间:2023-10-29 04:52:26 24 4
gpt4 key购买 nike

我是 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)中执行此操作,SELECT 将构建并发送到 SQL Server 将仅加载这 4 个字段(注意NHibernate 并不完全支持数据库级别的投影。当您加载一个实体时,您必须完全加载它)。网络上传输的数据较少,并且该数据包含在索引中的可能性很小(从索引加载数据通常比从表加载数据快,因为表可能有 1000 个字段,而索引可能恰好包含这 4 个字段)。

只选择部分列的操作在SQL术语中称为PROJECTION

具体案例:假设您在 SQL 之上构建了一个文件系统。这些字段是:

  • 文件名 VARCHAR(100)
  • 数据 block

现在您要读取文件列表。 SQL 中的简单 SELECT filename FROM files。如果您只需要文件名,则为每个文件加载data 是没有用的。请记住,data 部分可以“加权”兆字节,而 filename 部分最多可包含 100 个字符。

在阅读了将new 与匿名对象一起使用有多么“有趣”之后,请记住阅读@pleun 所写的内容,并记住:ORM 就像冰山:7/他们的 8 个工作隐藏在表面之下,随时准备反击。

关于c# - 为什么在 LINQ 中使用 "select new ",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7297638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com