所以,这是我的代码:注意这里的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 => 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
似乎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方法的执行顺序.到底是怎么回事?


基础教程推荐
- C#中Abstract方法和Virtual方法的区别 2023-05-30
- C#记一次http协议multipart/form-data的boundary问题 2023-06-14
- 浅谈Unity脚本生命周期与执行顺序 2023-04-21
- unity实现透明水波纹扭曲 2023-02-16
- VS2017使用Git进行源代码管理的实现 2023-03-08
- c# 使用线程对串口serialPort进行收发数据(四种) 2023-06-22
- C#导入和导出CSV文件 2023-06-08
- C#制作二维柱状图方法 2023-01-06
- Unity 如何获取鼠标停留位置下的物体 2023-04-10
- C#使用log4net记录日志 2023-05-11