我正在使用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两次来完成这项工作,或者让成功和状态注释的语句,但是当有大量注释时,这变得非常缓慢和冗余。有没有办法只运行一次订单并获得正确的结果?
答案 0 :(得分:0)
在SQL中,Order By
的子查询必须有一个TOP语句(你的不是)。当Linq检测到订购的子查询中没有FirstOrDefault
或Take
语句时,它只会删除OrderByDescending
。
如果您遇到查询性能问题,可能应该查看索引表。