LINQ - Минимизировать возвращенные записи - Правильный способ записи этих выражений - PullRequest
1 голос
/ 15 января 2010

Сотрудник - это тип объекта сущности.

var r1 = (from c in _ctx select c).Skip(5).Take(5);  

// my intent is to pull the first record from the query  
var r2 = (from c in _ctx select c).FirstOrDefault<Employee>();   

// my intent is to pull the last record from the query.
// any good way to ask for the result back in the reverse   
// order of the natural sort without specifing a field/property name?  
var r3 = (from c in _ctx select c).LastOrDefault<Employee>();  

Оттягивают ли они все записи (объекты), а затем фильтруют? Как лучше написать их так, чтобы вся строка была выражением LINQ?

Ответы [ 4 ]

2 голосов
/ 15 января 2010

Я полагаю, что (при условии _ctx является DataContext) сгенерированный SQL будет умеренно эффективным.

Могу ли я предложить вам запустить SQL Server Profiler во время выполнения этих кусков кода?

Я думаю, что запрос для r2 будет простым SELECT TOP (1) оператором.

r1 имеет шанс быть эффективным с:

SELECT TOP(5) [fields]
FROM (
       SELECT TOP (10) [fields]
       FROM [table]
       ORDER BY [identitycol] DESC
     )

r3 похоже, что он может просто выбрать все и взять последнюю запись.

Попробуйте Profiler и посмотрите:)

0 голосов
/ 15 января 2010

Откуда ты знаешь, какая последняя запись? Что определяет порядок? Разве вы не можете позвонить в OrderByDescending, а затем взять FirstOrDefault? Возможно, это приведет к более быстрому запросу.

0 голосов
/ 15 января 2010
  1. Фильтрует записи в базе данных, так как используется IQueryable. Тем не менее, @Codesleuth может быть прав в отношении r3.
  2. Самый симпатичный способ - _ctx.Employees.Skip(5).Take(5), потому что нет альтернативы запросам для вызовов методов Skip, Take, First и т. Д.
0 голосов
/ 15 января 2010

Если вы используете IQueryable, это означает, что вы создаете дерево выражений, которое будет запускаться в удаленном источнике

См. В чем разница между IQueryable и IEnumerable ?

Хорошие инструменты для работы с книгами c # 3.0 в NutShell, LinqPad, LINQ in Action

...