2015-03-04 12 views
5

Mam następujący kod:LINQ do podmiotów ignoruje moje oświadczenie orderby

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

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

z jakiegoś powodu, klauzula OrderBy jest ignorowana, gdy badam SQL wyjściowego za pomocą profilera. Co chcę zrobić, to wybrać wszystkie unikalne identyfikatory kota w tej samej kolejności, w jakiej pojawiają się one w myCats, i zachować charakter zapytania IQueryable.

Jeśli wstawię po zamówieniu .ToList(), kolejność pojawia się w SQL i działa. Jednak przy tak wielu kotach jest to bardzo powolne.

Jakieś pomysły, dlaczego tak się dzieje?

Odpowiedz

0

Można spróbować z pośrednim projekcji:

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(); 

Zapytanie jest jeszcze w pełni zrealizowane na DB.

lub za pomocą

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

GroupBy (tę drugą kwerendę zarówno z telefonem myCats i/lub mój myCats wariant)

0

wierzę następujący kod powróci wymaganych wyników:

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