代码之家  ›  专栏  ›  技术社区  ›  BritishDeveloper

Linq对实体的约束包括

  •  1
  • BritishDeveloper  · 技术社区  · 14 年前

    我有一个自连接到自身的消息表,其中message.ID==message.Parent。所以我有一条消息和几个孩子的消息。这是一个很好的导航属性设置。

    代码当前为:

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

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   Jeppe Stig Nielsen    14 年前

    我有一个针对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);
    

    Include Load Where 结果使用 AsEnumerable 否则他们就装不下了。

        2
  •  0
  •   BritishDeveloper    14 年前

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

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

    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()