Когда Linq's Take принимает результаты? - PullRequest
0 голосов
/ 30 мая 2009

Принимает ли указанное число и останавливается ли при запросе или после того, как весь список уже находится в коллекции?

Какой выигрыш в производительности, если таковой имеется при использовании 'take'?

Ответы [ 3 ]

3 голосов
/ 30 мая 2009

Все запросы происходят при перечислении.

Быстродействие, Take должен быть в состоянии определить наиболее эффективный способ получить несколько предметов.

Это означает преобразование в оператор "TOP n" в Linq to SQL.

.

Мой результат от (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 голос
/ 30 мая 2009

Другие ответы касались 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
1 голос
/ 30 мая 2009

Вы получите только указанное количество записей, возвращаемых из базы данных, фильтрация выполняется в SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...