Можем ли мы контролировать порядок выражений LINQ с помощью Skip (), Take () и OrderBy ()
Я использую LINQ to Entities для отображения постраничных результатов. Но у меня проблемы с сочетаниемSkip()
, Take()
а такжеOrderBy()
звонки.
Все отлично работает, кроме этогоOrderBy()
назначен слишком поздно. Он выполняется после того, как набор результатов был сокращенSkip()
а такжеTake()
.
Таким образом, каждая страница результатов имеет элементы в порядке. Но упорядочение выполняется на странице с несколькими данными вместо упорядочивания всего набора, а затем ограничения этих записейSkip()
а такжеTake()
.
Как мне установить приоритет с этими утверждениями?
Мой пример (упрощенный)var query = ctx.EntitySet.Where(/* filter */).OrderByDescending(e => e.ChangedDate);
int total = query.Count();
var result = query.Skip(n).Take(x).ToList();
Одно возможное (но плохое) решениеОдним из возможных решений будет применение кластеризованного индекса к порядку по столбцу, но этот столбец часто меняется, что снижает производительность базы данных при вставках и обновлениях. И я действительно не хочу этого делать.
РЕДАКТИРОВАТЬЯ побежалToTraceString()
на мой запрос, где мы можем увидеть, когда order by применяется к набору результатов. К сожалению в конце. :(
SELECT
-- columns
FROM (SELECT
-- columns
FROM (SELECT -- columns
FROM ( SELECT
-- columns
FROM table1 AS Extent1
WHERE EXISTS (SELECT
-- single constant column
FROM table2 AS Extent2
WHERE (Extent1.ID = Extent2.ID) AND (Extent2.userId = :p__linq__4)
)
) AS Project2
limit 0,10 ) AS Limit1
LEFT OUTER JOIN (SELECT
-- columns
FROM table2 AS Extent3 ) AS Project3 ON Limit1.ID = Project3.ID
UNION ALL
SELECT
-- columns
FROM (SELECT -- columns
FROM ( SELECT
-- columns
FROM table1 AS Extent4
WHERE EXISTS (SELECT
-- single constant column
FROM table2 AS Extent5
WHERE (Extent4.ID = Extent5.ID) AND (Extent5.userId = :p__linq__4)
)
) AS Project6
limit 0,10 ) AS Limit2
INNER JOIN table3 AS Extent6 ON Limit2.ID = Extent6.ID) AS UnionAll1
ORDER BY UnionAll1.ChangedDate DESC, UnionAll1.ID ASC, UnionAll1.C1 ASC