1

group by 句を使用する Entity Framework を使用してクエリを生成し、各グループを注文して特定のデータを取得しようとしています。let ステートメントを使用して 1 回だけ発生するように順序を最適化しようとしましたが、結果は正しくありませんが、クエリは引き続き実行されます。

概念:

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 変数をogn後続の let ステートメントで使用すると、リストの降順による順序が使用されず、間違った成功とステータスのメモが表示されることです。また、サブクエリを作成して結果を参照するように変更しようとしましたが、順序付きリストも返されないようです。

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 を 2 回使用するか、success および status ノートの let ステートメントを使用してこれを機能させることができますが、多くのノートがある場合、これは非常に遅くなり、冗長になります。注文を一度だけ実行して正しい結果を返す方法はありますか?

4

1 に答える 1

0

SQLでは、サブクエリにはTOPステートメントがOrder By 必要です(あなたのものはありません)。そして、Linq が順序付けられたサブクエリを含むFirstOrDefaultorステートメントがないことを検出すると、 . クエリでパフォーマンスの問題が発生している場合は、おそらくテーブルのインデックス作成を検討する必要があります。TakeOrderByDescending

于 2013-10-01T21:32:02.507 に答える