5

プロジェクト テーブルと監査テーブルの間に 1 対多の関係があります。各プロジェクト エンティティの最新のエントリを監査テーブルから選択しようとしています。

これを行うために私が理解していることから、プロジェクト ID でグループ化する前に、監査コレクションを日付で並べ替えて、各グループ (プロジェクト ID) の最初のエントリを選択して最新のエントリを取得できるようにする必要があります。

しかし、ef/linq クエリを実行すると、結果が正しくなく、order-by が無視されているように見えます。生成された SQL に order by ステートメントが含まれていません。

私が試した簡単な例を次に示します。

using (var ctx = new MyDbContext())
{
    var audit = from a in ctx.ProjectAudits
                orderby a.CreatedDate descending
                group a by a.ProjectId into grp
                select grp.FirstOrDefault();

    var resultsList = audit.ToList();
}

結果は、最新ではなく、各プロジェクト ID の最も古い監査エントリで常に返されます。

このクエリに何か問題がありますか? 明らかな何かが欠けていますか?

4

2 に答える 2

6

アップデート

よし、これはどう?

ctx.ProjectAudits
    .GroupBy(p => p.ProjectId)
    .Select(p => p.OrderByDescending(j => j.CreatedDate).FirstOrDefault())
    .ToList();

ここでは VS を使用しませんが、理論的にはレコードをグループ化し、グループ内で作成日に従って並べ替え、各グループから最初のレコードを選択する必要があります。

于 2013-04-26T11:34:35.563 に答える