给定这个对象结构,我如何带回一个 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子句,我认为它将带回我想要的东西