Я изучаю Linq-to-Sql и сталкиваюсь со сценарием, в котором я пытаюсь построить динамический запрос с сортировкой, фильтрацией и разбиением на страницы.
Если я запускаю запрос, напримерэто я могу получить «постраничные» результаты:
IQueryable<WorkOrder> query = (_dataContext.WorkOrders).Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();
в этом случае сгенерированный запрос выглядит следующим образом:
SELECT <columns>
FROM (
SELECT ROW_NUMBER() OVER (<columns>) AS [ROW_NUMBER], <columns>
FROM [dbo].[WorkOrders] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]
Однако, если я запускаю запрос, как это, этобольше не разбирается на страницы:
IQueryable<WorkOrder> query = (_dataContext.WorkOrders);
query.Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();
В этом случае сгенерированный запрос выглядит следующим образом:
SELECT <cut for brevity>
FROM [dbo].[WorkOrders] AS [t0]
Я не могу понять, что здесь происходит ... именно тогда, когда LinqSql сгенерировать запрос, и возможно ли добавить дополнительные критерии, такие как Skip, Take, OrderBy, к существующему IQueryable?Где бы я хотел оказаться, было бы что-то вроде этого:
IQueryable<WorkOrder> query = (_dataContext.WorkOrders);
if (User.IsNotAuthorizedToSeeSomething) {
query.Where(...);
}
if (search.sortField.Equals("Name")) {
query.OrderBy(...);
}
query.Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();