2015-03-04 14 views
5

Tôi có đoạn mã sau:LINQ cho các đối tượng được bỏ qua tuyên bố orderby tôi

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

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

Đối với một số lý do, mệnh đề OrderBy bị bỏ qua khi tôi kiểm tra SQL đầu ra bằng cách sử dụng hồ sơ. Những gì tôi muốn làm là chọn tất cả các Id mèo duy nhất theo thứ tự giống như chúng xuất hiện trong myCats và giữ nguyên bản chất IQueryable của yêu cầu.

Nếu tôi đặt .ToList() sau OrderBy, thứ tự xuất hiện trong SQL và nó hoạt động. Tuy nhiên với rất nhiều mèo, nó rất chậm để làm điều này.

Mọi ý tưởng tại sao điều này xảy ra?

Trả lời

0

Bạn có thể thử với một dự báo trung gian:

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

Các truy vấn vẫn được thực thi đầy đủ trên DB.

hoặc bằng

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

GroupBy (truy vấn thứ hai này cả với bạn myCats và/hoặc myCats biến thể của tôi)

0

Tôi tin rằng đoạn mã sau sẽ trả lại kết quả yêu cầu:

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 
Các vấn đề liên quan