【问题标题】:Constraint on Linq to Entities IncludeLinq 对实体的约束包括
【发布时间】:2010-06-22 08:49:08
【问题描述】:

我有一个消息表,它在 Message.ID == Message.Parent 处自我连接。所以我有 1 条带有多个 ChildMessage 的消息。这是通过 Navigation 属性很好地设置的。

代码目前是:

var message = from m in soe.Messages.Include("ChildMessages")
              where m.ID == id
              && m.IsActive
              select m;
return message.FirstOrDefault();

我真正想要的是只返回 1 条消息(等于特定 ID 和 isActive)及其所有 Active ChildMessages,我想在一次调用数据库中完成。

【问题讨论】:

    标签: asp.net entity-framework linq-to-entities


    【解决方案1】:

    我有一个 4.0 的解决方案(我不确定它是否适用于 3.5,我没有检查)。

    首先,将您的实体模型Lazy Loading Enabled 属性设置为false。请注意,因此您将失去自动加载的引用。

    接下来,试试这段代码:

    var message = soe.Messages
        .Where(m => (m.ID == id || m.ParentId == id) && m.IsActive)
        .AsEnumerable()
        .FirstOrDefault(e => e.Id == id);
    

    EF 将解析父子引用,并且不会加载其他子引用,除非发出明确的请求(如IncludeLoad)。请注意,您必须使用 AsEnumerable 遍历 Where 结果,否则它们将无法加载。

    【讨论】:

    • 但这并没有限制子消息。我想把 m.ChildMessages.IsActive 之类的东西放在哪里。但是 ChildMessages 是一个集合,所以它不会起作用。
    • 哦,现在我明白了。这是一个很好的问题。检查我的新答案。
    • 我确实希望填充 ChildMessages(但只有活动的)。顺便谢谢你的帮助
    • 我没有完全理解你最后的评论。我的解决方案是否满足您的要求?上述代码的结果将在一次访问数据库中为您提供请求的消息及其活动子消息。
    • 非常有趣的想法。它也几乎奏效了。每个父消息可以有多个孩子,这只返回一个父母和一个孩子。不确定我是否对缺少延迟加载选项感到高兴。 +1 好主意虽然
    【解决方案2】:

    我已经得出结论,这在实体框架中是不可能的。

    解决方法是返回一个满足约束的匿名类型。例如

    var message = from m in soe.Messages
                  where m.ID == id
                  && m.IsActive
                  select
                      new
                      {
                          Message = m,
                          ChildMessages = m.ChildMessages.Where(c => c.IsActive)
                      };
    return message.FirstOrDefault()
    

    【讨论】:

      猜你喜欢
      • 2013-06-21
      • 2017-07-12
      • 1970-01-01
      • 2013-03-23
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多