我有以下代码:
var myCats = _context.Cats.Where(c => c.OwnerId == 1).OrderBy(c => c.Age);
var uniqueCatIds = myCats.Select(c => c.CatId).Distinct();
由于某种原因,当我使用探查器检查输出SQL时,将忽略OrderBy
子句。我想要做的是按照它们在myCats中出现的顺序选择所有唯一的猫ID,并保留请求的IQueryable性质。
如果我将.ToList()
放在OrderBy之后,则排序将出现在SQL中并且可以正常工作。然而,有这么多猫,这样做很慢。
为什么会发生这种情况?
答案 0 :(得分: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
变体进行第二次查询
答案 1 :(得分: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