我有一个自己加入自己的消息表,其中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,我想在一次调用数据库时执行此操作。
答案 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将解析父子引用,除非会发出明确请求(如Include
或Load
),否则不会加载其他子引用。请注意,您必须使用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()