c# – 在此代码中返回相同结果但不同SQL的LINQ方法的执行顺序.到底是怎么回事?

所以,这是我的代码:注意这里的ToList()方法的位置,它是IEnumerable,逐行比较.Customers.ToList().Where(m=m.ID 3).OrderByDescending(m=m.Name).FirstOrDefault();Customers.Where(m=m.ID 3).ToList().Order...

所以,这是我的代码:
注意这里的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().其中??(m => m.ID> 3)
.OrderByDescending(M =&GT m.Name).FirstOrDefault()

> .ToList() – 可枚举
> .Where() – 可数
> .OrderByDescending() – 可枚举
> .FirstOrDefault – 可枚举

Customers.Where(m => m.ID> 3).ToList()
.OrderByDescending(M =&GT 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

似乎line1获取ENTIRE集合并将其传递给线路,而line3只获得一个实体.

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

第1行:内存密集型代码;由于线路中传递了更多数据,因此需要更多带宽;
第3行:数据库密集型代码;由于线路中传递的数据较少,因此需要较少的带宽

我很好奇每行代码之间内部发生了什么.它们相对类似,我得到了相同的结果.

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

解决方法:

像.Where()和.OrderBy()这样的方法使用延迟执行,这意味着它们在调用时所做的就是修改查询的表达式树 – 它们不会导致查询被执行.底层查询仅在被某些内容枚举时执行(例如,通过对其进行操作).

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

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

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

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

本文标题为:c# – 在此代码中返回相同结果但不同SQL的LINQ方法的执行顺序.到底是怎么回事?

基础教程推荐