2009-05-30 8 views
0

クエリを実行している間、またはリスト全体が既にコレクションに入った後で、指定された数を取得して停止しますか?LinqのTakeはいつですか?

'take'を無効にするときにパフォーマンスが向上するのは何ですか?

答えて

3

すべてのクエリは列挙で行われます。

パフォーマンスを向上させるには、いくつかのアイテムを取得する最も効率的な方法を判断できる必要があります。

これは、Linq to 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] 
+0

は、私が「ORDERBY初何をすれば? – zsharp

+0

これらの操作はすべてSQL Serverに委譲されているため、索引などを使用して最高のパフォーマンスを実現できます。 –

1

、フィルタリングはSQLで行われます。

+0

私は 'Orderby'を最初にやりますか? – zsharp

+0

違いはありません。式ツリーは同じSQLに変換されます –

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 
関連する問題