所以,这是我的代码:注意这里的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#基于Socket的网络通信类你了解吗 2023-05-26
- Linux - CentOS 7 安装 .Net Core 运行环境 2023-09-26
- c# 委托的常见用法 2023-03-09
- LINQ基础之Join和UNION子句 2023-05-31
- C# 泛型接口的抗变和协变 2022-11-06
- C#批量插入Sybase数据库,Anywhere 8 2023-11-13
- C#反射机制介绍 2023-05-25
- windows下asp.net core 低成本最简化部署方式 2023-09-26
- c# – 自动将Windows服务部署/安装到多个远程端点的最佳方法? 2023-09-20
- WPF实现能自由改变形状的四边形和六边形 2023-07-18