У меня есть запрос LINQ, который создается по частям, например так:
var initialQuery = from item in MyContext where xxx == yyy select item;
var furtherQuery = from item in initialQuery where bla == foo select new { some stuff };
// more code here...
// eventually:
var yetAnotherQuery = (from item in furtherQuery ...)
.OrderBy(my_condition);
// As far as I know, the following query should still maintain the order of the previous one
// see: https://stackoverflow.com/questions/911942/are-subqueries-in-linqtosql-guaranteed-to-be-in-the-same-order-as-their-parent
var stillAnotherQuery = (from item in yetAnotherQuery
select item.data_I_care_about)
.Distinct();
// And finally...
var finalQuery = stillAnotherQuery.Skip(PageIndex).Take(PageSize);
Но я получаю исключение, когда Skip ()
вызывается, говоря, что запрос не упорядочен!
Таким образом, очевидно, что то, что указано в моем комментарии к коду выше, и вопрос SO , на который ссылаются, не совсем верны. Фактически другой ответ SO указывает, что сохранение этого порядка не гарантируется.
Кто-нибудь знает хороший способ сделать то, что я пытаюсь достичь?
Я решил просто включить ROW_NUMBER
в свои промежуточные результаты и упорядочить его в самом конце, но я не могу найти способ получить этот ROW_NUMBER
в моих результатах через LINQ.
Я видел несколько других SO вопросов , пытающихся получить ROW_NUMBER там, но, насколько я видел, все они являются клиентскими.
Кажется, я загнал себя в угол. Кто-нибудь знает (LINQ-совместимый) выход?
Некоторые предлагали мне сделать Distinct ()
перед OrderBy ()
.
Я считаю, что это дало бы мне другие результаты.
Представьте, что у меня есть эта таблица данных
myRank | myData
-------+--------
3 | A
1 | B
2 | A
Предположим, я упорядочиваю по myRank
, а данные, которые меня волнуют, - myData
, и представьте, что мой исходный код был таким:
var query = from item in MyTable
select item;
query = query.OrderBy(item => item.myRank);
var derivedQuery = from item in query // Note: we throw away myRank
select item.myData;
derivedQuery = derivedQuery.Distinct();
Если я поменяю местами порядок OrderBy ()
и Distinct ()
, я получу разные результаты. Я не хочу, чтобы myRank
был включен в Distinct ()
.
Извините, это часть гораздо более крупного процесса, поэтому сложно учесть все детали в этом вопросе.
Но, надеюсь, в этом есть смысл?