实体框架组按顺序排序

时间:2013-10-01 21:18:34

标签: c# linq entity-framework

我正在使用Entity Framework生成查询,该查询使用group by子句,然后尝试对每个组进行排序以获取特定数据。我尝试优化顺序,只使用let语句发生一次,但结果不正确但查询仍然执行。

概念:

var results = 
(from n in noteEntities.NoteLog
where associatedIDs.Contains(n.AssociatedID)
group n by n.AssociatedID into gn
let ogn = gn.OrderByDescending(t => t.CreatedDateTime)
let successNote = ogn.FirstOrDefault(x => x.Type == "Success")
let lastStatusNote = ogn.FirstOrDefault()
select new { Success = successNote, Status = lastStatusNote, AssociatedID = gn.Key }).ToList();

然而,问题是在后续的let语句中使用,应该是有序的let变量,ogn是不是按降序列表使用顺序而且我得到了错误的成功和状态注释。我也尝试过更改内容来创建一个子查询并引用结果,但这似乎也没有返回一个有序列表,例如:

var subQuery = 
(from n in noteEntities.NoteLog
where associatedIDs.Contains(n.AssociatedID)
group n by n.AssociatedID into gn
select gn.OrderByDescending(t => t.CreatedDateTime));

var results = 
(from s in subQuery
let successNote = s.FirstOrDefault(x => x.Type == "Success")
let lastStatusNote = s.FirstOrDefault()
select new { Success = successNote, Status = lastStatusNote }).ToList();

我可以通过在select语句中使用OrderByDescending两次来完成这项工作,或者让成功和状态注释的语句,但是当有大量注释时,这变得非常缓慢和冗余。有没有办法只运行一次订单并获得正确的结果?

1 个答案:

答案 0 :(得分:0)

在SQL中,Order By 的子查询必须有一个TOP语句(你的不是)。当Linq检测到订购的子查询中没有FirstOrDefaultTake语句时,它只会删除OrderByDescending

如果您遇到查询性能问题,可能应该查看索引表。