Linq对实体的约束包括

时间:2010-06-22 08:49:08

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

我有一个自己加入自己的消息表,其中Message.ID == Message.Parent。所以我有一条带有几个ChildMessages的消息。这可以通过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,我想在一次调用数据库时执行此操作。

2 个答案:

答案 0 :(得分: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),否则不会加载其他子引用。请注意,您必须使用Where迭代AsEnumerable结果,否则将无法加载。

答案 1 :(得分:0)

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

解决方法是返回满足约束的匿名类型。 E.g。

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