Linq Select 和 ToList 之间的性能差异

Cra*_*aig 1 c# linq

以下 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 会解决这个问题,而不管后者吗?

Daw*_*wan 7

不,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 列,过滤,然后在数据库服务器上排序。