LINQ to entities忽略了我的orderby语句

时间:2015-03-04 10:19:03

标签: c# sql-server-2012 linq-to-entities

我有以下代码:

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中并且可以正常工作。然而,有这么多猫,这样做很慢。

为什么会发生这种情况?

2 个答案:

答案 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