所以,这是我的代码:
注意 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,按顺序排列:
选择 [t0].[ID], [t0].[Name] 从 [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 获得了整个集合并将其通过线路传递,而 line3 仅获得一个实体。
根据 SQL 输出,我可以推断:
line1: 内存密集型代码;需要更多带宽,因为更多数据在线路中传递;
line3: 数据库密集型代码;需要更少的带宽,因为在线路中传递的数据更少
我很好奇每行代码之间的内部情况。它们相对相似,我得到了相同的确切结果。