【问题标题】:EF Query With Conditional Include带有条件包含的 EF 查询
【发布时间】:2009-10-08 03:18:47
【问题描述】:

我有两个表:一个 WorkItem 表和一个 WorkItemNote 表。如何返回一个 WorkItem 和所有符合特定条件的 WorkItemNotes?

我认为这应该很简单,几乎就像一个条件“包含”,对吧?

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    我一直计划就此写信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 集合中。

    这是因为所谓的关系修复。

    即这为您提供了您想要的条件包含。

    希望对你有帮助

    Alex

    【讨论】:

    • 真的吗? x.Item 会有相应的 WorkItemNotes 吗?棒极了!我很高兴你发布了这个,因为我目前有查询每个 WorkItem 的数据库。谢谢!
    • 一个问题:为什么中介必须是IEnumerable?可以是 IQueryable 吗?
    • 是的,这行得通。您也可以将其用于其他技巧,例如排序,请参阅我的技巧系列的技巧 1!
    • Alex:我希望我能给你更多的支持;这就像一个魅力!我还使用了您的提示 #22 来包含 WorkItemNote 的相关对象。再次感谢!
    • 2 年多过去了,这仍然在帮助人们!谢谢你。我们有没有机会获得一个实现条件包含的 .Include?​​span>
    猜你喜欢
    • 2012-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2012-11-10
    • 2015-01-10
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多