Take() 方法如何工作?

How does the Take() method work?

我有一个有点大的 table 我正在我的网络应用程序中查询,我只想 return N 来自table。

我已经通读了 MSDN 文档,但我看不到它在哪里说明 Take() 首先从数据库中提取所有记录,或者它的行为是否类似于 SQL服务器的TOP

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

参见 Return Or Skip Elements in a Sequence

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();

生成这个 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]

如果您想确定 SQL 您的 LINQ 正在生成什么,请使用 SQL Profiler(如果您使用的是 SQL 服务器)。对于您编写的任何 LINQ,这始终是一个好习惯。

它只会直接检索N条记录。

林克:

dbContext.table.Where(w => w.id== 1).Take(10);

会生成如下SQL

select top 10 * from table

您可以使用 SQL 服务器配置文件查看生成的查询,或者当 运行 在调试器下时,IntelliTrace 显示进行了 SQL 个查询。

它尽其所能。

由于您似乎正在使用 SQL 服务器并且它的引擎知道 SQL 服务器有一个 TOP 它会使用它。它还可以将其与 MS Access 一起使用。

如果您使用的是 PostgreSQL、MySQL 或 SQL Lite,它将使用 LIMIT.

它也可能使用 "fetch first " + n + " rows only"(DB2 和 SQL:2008 标准样式)或 "select first " + n + "from"(Informix 样式)或 "select * from (" + restOfQuery + ") where rownum <= " + n 在 Oracle 或任何给定数据库需要的地方。

如果有人为绝对不能支持此类限制的数据库编写引擎,那么它确实可以在获取所需内容后关闭结果流。

无论哪种方式,它都会在特定情况下尽力而为。

顺便说一句,它也使用相同的方法,First() 及其变体的值为 1Single() 及其变体的值为 2变体(因为您需要尝试至少取 2 行来测试是否只有 1 行)。

以下是我每次使用的性能出色的 gridviews 分页:

    resultList = context.MYTABLE.Where(WhereClause).OrderBy(orderCondition).Skip(firstItemIndex).Take(lastItemIndex - firstItemIndex + 1).ToList();

WhereClause 是查询的 WHERE 部分(即 'myObj.field > 1') OrderBy 我猜已经够清楚了。 firstItemIndex 是我传递的值,用于告诉我要从哪个记录开始(如果我的分页长度为 15 个元素,并且我从页面调用该函数2,该值将是 15*2 = 30 ) 所以我们想跳过那个数量的记录。 Take 部分告诉我要从数据库中检索多少条记录。有不同的方法可以做到这一点,在我的例子中,我使用了一个自定义寻呼机,它给了我一个 'maxItemIndex' 计算值。所以我必须从该值中减去 firstItemIndex 才能知道要获取多少条记录。 这样,只从数据库中检索指定数量的记录,这是非常好的性能。 希望对你有帮助