是否需要指定的数字并在查询时或整个列表已经在集合中后停止?
如果在采取'采取'的时候有什么表现好处?
答案 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