gpt4 book ai didi

c# - 此代码中返回相同结果但不同 SQL 的 LINQ 方法的执行顺序。里面到底发生了什么?

转载 作者:太空狗 更新时间:2023-10-30 00:33:49 24 4
gpt4 key购买 nike

所以,这是我的代码:

注意这里 ToList() 方法的位置,是IEnumerable的,逐行比较。

Customers.ToList().Where(m=>m.ID > 3).OrderByDescending(m=>m.Name).FirstOrDefault();

Customers.Where(m=>m.ID > 3).ToList().OrderByDescending(m=>m.Name).FirstOrDefault();

Customers.Where(m=>m.ID > 3).OrderByDescending(m=>m.Name).ToList().FirstOrDefault();

让我们逐行分析:

Customers.ToList().Where(m=>m.ID > 3)
.OrderByDescending(m=>m.Name).FirstOrDefault()

  • .ToList() - 可枚举
  • .Where() - 可枚举
  • .OrderByDescending() - 可枚举
  • .FirstOrDefault - 可枚举

Customers.Where(m=>m.ID > 3).ToList()
.OrderByDescending(m=>m.Name).FirstOrDefault()

  • .Where() - 可查询
  • .ToList() - 可枚举
  • .OrderByDescending() - 可枚举
  • .FirstOrDefault() - 可枚举

Customers.Where(m=>m.ID > 3).OrderByDescending(m=>m.Name)
.ToList().FirstOrDefault()

  • .Where() - 可查询
  • .OrderByDescending() - 可查询
  • .ToList() - 可枚举
  • .FirstOrDefault() - 可枚举

现在,这是他们的 SQL,按顺序:

SELECT [t0].[ID], [t0].[Name] FROM [Customer] AS [t0] GO

SELECT [t0].[ID], [t0].[Name] FROM [Customer] AS [t0] WHERE [t0].[ID]

SELECT TOP (1) [t0].[ID], [t0].[Name] FROM [Customer] AS [t0] WHERE [t0].[ID] > @p0 ORDER BY [t0].[Name] DESC

似乎第 1 行获取了整个集合并将其通过线路传递,而第 3 行仅获取了一个实体。

根据SQL输出,我可以推断:

第 1 行: 内存密集型代码;需要更多的带宽,因为更多的数据通过线路传输;
line3: 数据库密集型代码;需要更少的带宽,因为有线传输的数据更少

我很好奇每一行代码之间的内部情况。它们相对相似,我得到了完全相同的结果

这里到底发生了什么(在 C# 及其功能的内部?)?

最佳答案

.Where().OrderBy() 这样的方法使用延迟执行,这意味着它们在调用时所做的只是修改查询的表达式树 - 它们不要导致查询被执行。底层查询仅在被某些东西枚举时执行(例如,通过对其执行 foreach)。

另一方面,

.ToList() 旨在返回查询结果的内存列表,也就是说,它实际上会导致执行查询。它在概念上类似于执行类似以下伪代码的操作

foreach (item in query)
list.add(item)

在您的示例中,查询由 .ToList() 执行,从那时起您正在执行一个新查询,这次是针对内存中的集合。

因此,在第一个示例中,客户查询由 ToList()、.Where().OrderBy() 立即执行,只需修改一个新的使用 Linq to objects 查询提供程序的表达式树,此 Linq to objects 查询由 FirstOrDefault() 执行。

关于c# - 此代码中返回相同结果但不同 SQL 的 LINQ 方法的执行顺序。里面到底发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10136659/

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