LINQ - Как мне упорядочивать (сложные) результаты?

У меня есть запрос 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 () .

Извините, это часть гораздо более крупного процесса, поэтому сложно учесть все детали в этом вопросе.

Но, надеюсь, в этом есть смысл?

5
задан Community 23 May 2017 в 12:19
поделиться