所以,这是我的代码:注意这里的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# 解决在Dictionary中使用枚举的效率问题 2023-04-10
- C# 动态输出Dos命令执行结果的实例(附源码) 2023-03-04
- C# 枚举Color并展示各种颜色效果的示例 2023-04-22
- c# – 如何相对于按钮在Windows应用商店应用中定位弹出控件? 2023-09-20
- C# WPF后台动态添加控件实战教程 2023-06-08
- Linux下安装SkyWalking 6.x版本 以及.NETCore项目集成 2023-09-28
- C#判断字符串中是否包含指定字符串及contains与indexof方法效率问题 2022-12-31
- 深入了解c# 迭代器和列举器 2023-03-09
- c# – 当其他用户进行更改时刷新Windows程序? 2023-09-18
- 如何从dump文件中提取出C#源代码 2023-04-10