Take()方法如何工作?

Rah*_*ore 8 .net c# linq linq-to-entities entity-framework

我在我的网络应用程序中查询了一个有点大的表,我只想从表中返回N行.

我已经阅读了MSDN文档,但是如果Take()首先从数据库中提取所有记录,或者它的行为与SQL Server类似,我看不出它的状态TOP.

我担心是否Take()会提取所有记录,然后获得前N个记录或者它会按预期运行并直接检索N个记录

Nic*_*las 11

请参阅序列中的返回或跳过元素.

Take(N)将添加TOP N到您的SQL并仅检索N记录.

例如(使用我自己的SQL Server 2014和EF 6.1):

这个LINQ:

var query = await dbContext.Lookup
                           .Where(w => w.LookupCd == '1')
                           .Take(10)
                           .ToListAsync();
Run Code Online (Sandbox Code Playgroud)

生成这个SQL:

SELECT TOP (10) 
    [Extent1].[LookupId] AS [LookupId], 
    [Extent1].[LookupTypeId] AS [LookupTypeId], 
    [Extent1].[LookupCd] AS [LookupCd], 
    [Extent1].[LookupName] AS [LookupName], 
    [Extent1].[LookupDescription] AS [LookupDescription]
FROM [dbo].[Lookup] AS [Extent1]
WHERE '1' = [Extent1].[LookupCd]
Run Code Online (Sandbox Code Playgroud)

如果要确定LINQ正在生成哪种SQL,请使用SQL事件探查器(如果您使用的是SQL Server).对于您编写的任何LINQ,这始终是一个很好的做法.

SQL事件探查器