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()
及其变体的值为 1
,Single()
及其变体的值为 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 才能知道要获取多少条记录。
这样,只从数据库中检索指定数量的记录,这是非常好的性能。
希望对你有帮助
我有一个有点大的 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()
及其变体的值为 1
,Single()
及其变体的值为 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 才能知道要获取多少条记录。 这样,只从数据库中检索指定数量的记录,这是非常好的性能。 希望对你有帮助