以下 linq 表达式会导致相同的性能吗?
在我想象的场景中,我的表 MyData。有 25 列和 50,000 行。我正在尝试根据 WHERE 获取所有 MyData 记录。
var myData = _myDb.Entities<MyData>()
.ToList()
.Select(p => new { p.Name, p.Id })
.Where(y => y.DepartmentId = 1)
.OrderBy(x => x.Name);
Run Code Online (Sandbox Code Playgroud)
对比
var myData = _myDb.Entities<MyData>()
.Where(y => y.DepartmentId = 1)
.Select(p => new { p.Name, p.Id })
.OrderBy(x => x.Name)
.ToList();
Run Code Online (Sandbox Code Playgroud)
SELECT * FROM MyData由于语句中 ToList() 的顺序,我认为第一个查询基本上会执行 a 。昂贵。所有数据带回客户端,然后应用排序和过滤。
SELECT Name, Id FROM MyData WHERE DepartmentId = 1 ORDER BY Name在这种情况下,第二个选项会更好,执行一个- 如此小的数据集,按 SQL 排序。
或者 Linq 会解决这个问题,而不管后者吗?
不,LINQ 无论如何都不会解决这个问题。
我在 Linq Pad 中使用我的数据库创建了一个查询示例。
第一个是这个
TelematicDevices
.ToList()
.Where(s => s.sReference.Contains("abc"))
.Select(p => new { p.sReference, p.iDeviceId})
.OrderBy(x => x.sReference)
.Dump();
Run Code Online (Sandbox Code Playgroud)
生成以下 SQL
SELECT
[Extent1].[iDeviceId] AS [iDeviceId],
[Extent1].[iDeviceTypeId] AS [iDeviceTypeId],
[Extent1].[iGSMProviderId] AS [iGSMProviderId],
[Extent1].[sAssetClass] AS [sAssetClass],
[Extent1].[iCompanyId] AS [iCompanyId],
[Extent1].[iAssetId] AS [iAssetId],
[Extent1].[sReference] AS [sReference],
[Extent1].[sDescription] AS [sDescription],
[Extent1].[sSoftwareId] AS [sSoftwareId],
[Extent1].[sIMEI] AS [sIMEI],
// ... ALL OTHER COLUMNS IN MY TABLE
FROM [dbo].[TelematicDevices] AS [Extent1]
GO
Run Code Online (Sandbox Code Playgroud)
第二个查询
TelematicDevices
.Where(s => s.sReference.Contains("abc"))
.Select(p => new { p.sReference, p.iDeviceId })
.OrderBy(x => x.sReference)
.ToList()
.Dump();
Run Code Online (Sandbox Code Playgroud)
生成以下 SQL
SELECT
[Extent1].[iDeviceId] AS [iDeviceId],
[Extent1].[sReference] AS [sReference]
FROM [dbo].[TelematicDevices] AS [Extent1]
WHERE [Extent1].[sReference] LIKE N'%abc%'
ORDER BY [Extent1].[sReference] ASC
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,这是有区别的。
第一个查询将选择所有数据和列 - 然后在应用程序后端过滤和排序。
第二个查询将只选择 2 列,过滤,然后在数据库服务器上排序。