我有两个表:WorkItem表和WorkItemNote表。如何返回符合特定条件的WorkItem和所有WorkItemNotes?
我认为这应该很简单,几乎就像有条件的“包含”一样,对吗?
答案 0 :(得分:38)
我一直在计划写a tip,但你的问题让我感到震惊。
假设WorkItem
有许多WorkItemNotes
你可以这样做:
var intermediary = (from item in ctx.WorkItems
from note in item.Notes
where note.SomeProp == SomeValue
select new {item, note}).AsEnumerable();
这会为匹配的每个WorkItemNote
生成一个匿名元素,并保留相应的WorkItem
。
EF身份解析确保如果多个WorkItem
符合条件,则会多次返回相同的WorkItemNotes
(按引用)。
我假设接下来你只想回到WorkItems
,就像这样:
var workItems = intermediary.Select(x => x.item).Distinct().ToList();
然后,如果你现在这样做:
foreach(var workItem in workItems)
{
Console.WriteLine(workItem.Notes.Count)
}
您将看到与原始过滤器匹配的WorkItemNotes
已添加到每个workItem
的Notes集合中。
这是因为有一种叫做“关系修正”的东西。
即。这为你提供了你想要的条件包括。
希望这有帮助