2015-03-04 3 views
5

У меня есть следующий код:LINQ к объектам игнорирует мое OrderBy заявление

var myCats = _context.Cats.Where(c => c.OwnerId == 1).OrderBy(c => c.Age); 

var uniqueCatIds = myCats.Select(c => c.CatId).Distinct(); 

По какой-то причине, оговорка OrderBy игнорируется, когда я исследую выход SQL с помощью профилировщика. То, что я хочу сделать, это выбрать все уникальные идентификаторы cat в том же порядке, что и в myCats, и сохранить характер запроса IQueryable.

Если я положил .ToList() после OrderBy, заказ появится в SQL, и он будет работать. Однако с таким количеством кошек это очень медленно.

Любые идеи, почему это происходит?

ответ

0

Вы можете попробовать с промежуточной проекции:

var myCats = _context.Cats.Where(c => c.OwnerId == 1).OrderBy(c => c.Age).Select(c => new { c.Age, c.CatId }); 

var uniqueCatIds = myCats.Select(c => c.CatId).Distinct(); 

Запрос по-прежнему полностью выполняется на БД.

или с помощью GroupBy

var uniqueCatIds = myCats.GroupBy(c => c.CatId).Select(c => c.Key); 

(этот второй запрос как с вашим myCats и/или мой myCats вариант)

0

Я считаю, что следующий код будет возвращать необходимые результаты:

from c in _context.Cats 
where c.OwnerId == 1 
group c by c.CatId into grouped 
orderby grouped.Min(c => c.Age) 
select grouped.Key 
Смежные вопросы