以下を LINQ ステートメントに変換する手を得ることができますか。
SELECT reports.* FROM [dbo].[ReportLists] rl
INNER JOIN [dbo].[ReportItems] ri ON rl.Id = ri.ReportListId
INNER JOIN [dbo].[Reports] reports ON ri.Id = reports.ReportItemId
WHERE
reports.createdDate
IN (
SELECT
MAX(report_max_dates.createdDate)
FROM
[dbo].[Reports] report_max_dates
GROUP BY
report_max_dates.seedLot
)
現在、私はこれまでにそれを持っています:
db.ReportLists.Select(rl => db.ReportItems
.Where(ri => ri.ReportListId == rl.Id)
.Select(ri => db.Reports
.Where(r => r.ReportItemId == ri.Id)
.GroupBy(r => new { r.seedLot })
.Select(g => g.OrderByDescending(x => x.createdDate).FirstOrDefault())));
上記の LINQ の問題は、タイトルが変更されたエントリが返されることです。データベース内で、すべてのレコードの履歴を保持します (したがって、createdDate の最初の順序が降順である必要があります。レポートをタイトル x からタイトル y に変更すると、最新のレコードのみが必要な場合に両方のタイトルの下に表示されます。したがって、タイトル y の下のものになります。
編集 詳細が不足していて申し訳ありません。レポートに関する情報を保持するレポート テーブルがあります (seedlot は識別子です)。レポートが編集されるたびに、履歴が保持されるように、新しいレコードが挿入されます (古いレコードの更新に対して)。この場合、createdDate の max エントリは、レポートが表示される最新のレコードであることを示します。レポートは、タイトルまたは ReportItems にグループ化されます。これらのレポート アイテムには、タイトルと関連するレポートが含まれます。これらの reportItems は、JSON を目的の形式で出力できるように ReportList に保持され、ReportItems によってリンクされたステータス列と ID のみを含みます。
レポートがタイトル a からタイトル b に移動された場合、タイトル外部キーが変更後のタイトルにリンクされた新しいレコードが入力されます。これが発生すると、上記の LINQ は、(上記の例から) タイトル b の最新のエントリのみを返す必要があるときに、個々の ReportItem の下にレコードを返します。これ以外の LINQ ステートメントは、createdDate の最新のレコードのみを返します。
これが私のクラス構造です(DB構造も模倣しています)
public class ReportList {
public int Id {get;set;}
public string status {get;set;}
public List<ReportItem> {get;set;}
}
public class ReportItem {
public int Id {get;set}
public string title {get;set;}
public List<Report> {get;set;}
}
public class Report {
public int Id {get;set;}
public string Lot {get;set;}
... Other data ...
public DateTime createdDate {get;set;}
}
ありがとう、ディーマン