Linq's Take什么时候取结果?

时间:2009-05-30 03:43:39

标签: linq linq-to-sql

是否需要指定的数字并在查询时或整个列表已经在集合中后停止?

如果在采取'采取'的时候有什么表现好处?

3 个答案:

答案 0 :(得分:3)

所有查询都在枚举时发生。

性能方面,Take应该能够确定最有效的方法来获取一些项目。

这意味着将Linq转换为SQL中的“TOP n”语句。

(q.Take(10)).ToString()的结果:

SELECT TOP (10) [t0].[UserID], [t0].[RoleID]
FROM [dbo].[UsersRoles] AS [t0]

并且(q.Skip(10).Take(10)).ToString()

的结果
SELECT [t1].[UserID], [t1].[RoleID]
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[UserID], [t0].[RoleID]) AS [ROW_NUMBER], [t0].[UserID], [t0].[RoleID]
    FROM [dbo].[UsersRoles] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]

答案 1 :(得分:1)

您将只获取从数据库返回的指定记录数,过滤在SQL中完成。

答案 2 :(得分:1)

其他答案是关于LINQ to SQL,它也在标签中,但值得一提的是LINQ to Objects将按照你的建议行事。有效地做这样的事情:

int i = 0;
foreach (var item in items) {
    if ( i++ < count ) {
        yield return item;
    }
}

因此换句话说,它只需要尽可能多的东西,并尽快停止。

显然,这意味着:

var c = items.Take(10);  // not yet enumerated
c.Count();  // enumerated the first 10
c.Count();  // enumerated the first 10 again