EF не поддерживает Take
и Skip
?
Прелесть LINQ заключалась в том, что вы могли описать этот сложный критерий сортировки и просто отобразить результат, сказав q.Skip(50).Take(50)
.Это заняло бы вторую страницу, если бы на каждой странице отображалось 50 результатов.И, конечно, он переведен на эффективный T-SQL, который использует оконную функцию ROW_NUMBER
, чтобы дать указание базе данных искать результат, используя указанный вами порядок.
Вы можете даже получить очень сложный запрос с большим количествомфильтры.Конечным результатом все еще можно управлять, поскольку у вас либо будут строки, либо их нет.Все, о чем вам нужно подумать, это то, что результат может быть пустым.
Примечание об идентичности, как указал Ладислав, не гарантируется порядок между записями одного и того же ключа сортировки (т. Е. Date и Time оба равны нулю).).Итак, вы делаете, что вы добавляете столбец идентификации, который является вашим наименее важным столбцом сортировки.Журнальную таблицу / сущность, которая не имеет идентификатора, можно до некоторой степени утверждать, что она неправильно спроектирована, поскольку рост данных непредсказуем, когда дата и время могут быть равны нулю.Это приведет к плохим разбиениям страницы.Практическое правило заключается в том, что таблица должна иметь узкий и уникальный первичный ключ кластеризации.Столбец идентичности подходит для этого довольно хорошо.Это также гарантирует, что вставки - это быстрые операции, которые оценят ваши журнальные таблицы.
С помощью представления вы можете поместить элементы order и row_number в простой T-SQL, а затем запросить их с помощью EF следующим образом:
var q = from x in source
join y in source on x.RowNumber equals y.RowNumber - 1 into prev
join z in source on x.RowNumber equals z.RowNumber + 1 into next
from p in prev.DefaultIfEmpty()
from n in next.DefaultIfEmpty()
select new { Current = x, Previous = p, Next = n }
;
... или, возможно:
var q = from x in source
join y in source on x.RowNumber equals y.RowNumber - 1 into prev
join z in source on x.RowNumber equals z.RowNumber + 1 into next
select new {
Current = x,
Previous = prev.DefaultIfEmpty(),
Next = next.DefaultIfEmpty()
}
;