このオブジェクト構造を考えると、WorkItem を戻すにはどうすればよいですか。それはレポート、行、および生徒ですが、生徒の名前が「ボブ」である行のみです (「アリス」を含む行は省略したいと思います)。 'および'クレア')。
WorkItem
----Report1 (WorkItem.Reports コレクションに保持)
--------ReportRow1 (Report.ReportRows コレクションに保持)
------------Student.Name = 'Alice'--------ReportRow2 (Report.ReportRows コレクションに保持)
------------Student.Name = 'Bob'--------ReportRow3 (Report.ReportRows コレクションに保持)
------------Student.Name = 'Claire'
(整形でごめんなさい)
このようなものがうまくいくと思っていましたが、それでも3行すべてが返されます
WorkItem found = (from workItem in session.Query<WorkItem>()
from report in workItem.Reports
from row in report.ReportRows
where workItem.Id == 1 && row.Student.Name == "Bob"
select workItem)
.SingleOrDefault<WorkItem>();
更新 私もこれを試しましたが、実際にそれらを使用しようとしたときにのみ結果が返されると考えていましたが(そうです)、ログを見ると、それでも各学生の選択が行われます(「where」句が最後の foreach ループは、私が興味を持っていたものだけを返します。
var query = from workItem in session.Query<WorkItem>()
where workItem.Id == 1
select workItem;
WorkItem found = query.SingleOrDefault<WorkItem>();
foreach (var report in found.Reports)
{
foreach (var row in report.ReportRows.Where(x => x.Student.Name == "Bob"))
{
Console.WriteLine("--" + row.Student.Name);
}
}
これは、Ocelot20 の助けを借りて、現在の私の最高の試みです。
var result = (from workItem in session.Query<WorkItem>()
.FetchMany(x => x.Reports)
.ThenFetchMany(y => y.ReportRows.Where(z => z.Student.Name == "Bob"))
where workItem.Id == 1
select workItem);
唯一機能しないのは、学生名のWhere句です。それを削除すると、結果が返されます(行が多すぎますが)。where句を正しく取得できれば、必要なものが返されると思います