实体框架。嵌套在.Include中 [英] Entity Framework .Where nested in .Include
问题描述
我正在尝试使用EF5代码执行数据库查找。基本结构和表关系如下:
I'm attempting to perform a db lookup using EF5 code-first. The basic structure and table relationships are as follows;
public partial class Member
{
public int RecordID {get; set;}
public string Name {get; set;}
...etc.
public virtual ICollection<MemberLink> MasterLinks {get; set;}
public virtual ICollection<MemberLink> SlaveLinks {get; set;}
public virtual ICollection<Message> ReceivedMessages {get; set;}
public virtual ICollection<Message> SentMessages {get; set;}
}
public partial class MemberLink
{
public int RecordID {get; set;}
public virtual Member MasterMember {get; set;}
public virtual Member SlaveMember {get; set;}
...etc.
}
public partial class Message
{
public int RecordID {get; set;}
public virtual Member Sender {get; set;}
public virtual Member Recipient {get; set;}
...etc.
}
现在,我试图执行的查询是使用 MemberLinkRepository ,看起来像;
Now, the query I'm trying to perform is using the MemberLinkRepository, and looks like;
public IList<MemberLink> GetMasterLinks(int p_MemberID)
{
return Get()
.Include ( memberLink => memberLink.MasterMember )
.Include ( memberLink => memberLink.SlaveMember )
.Include ( memberLink => memberLink.MasterMember.ReceivedMessages
.Where(
msg => msg.Sender.RecordID == memberLink.SlaveMember.RecordID) )
.Where ( memberLink => memberLink.MasterMember.RecordID == p_MemberID)
.ToList();
除了EF似乎不喜欢嵌套的Where。我可以将它分成两个独立的存储库调用(实际上,它看起来像我可能必须这样做),但是为了减少对db的调用,我试图在一次犯规中执行此操作。有没有人知道如何在一个单一的查询中实现这一点?
Except EF doesn't seem to like the nested Where. I could split this out into 2 separate repository calls (and indeed, it's looking like I might have to do that) but in the interest of reducing calls to the db I'm trying to do it in one foul swoop. Does anyone know how I can achieve this in one single query?
我希望代码说明我正在做什么...如果没有,我会尝试并解释一点更好。
I hope the code illustrates what I'm trying to do... If not, I'll try and explain a little better.
推荐答案
简短的答案是否定的,EF不会让你使用包含()
。
The short answer is no, EF will not let you do that using Include()
.
如果允许,请考虑结果:在某种情况下,您的 MemberLink。 MasterMember.ReceivedMessages
将被完全填充,在另一个相同的查找对象 MemberLink.MasterMember.ReceivedMessages
实际上是一个子集的消息!如果您尝试添加到ReceivedMessages,会发生什么?如果添加与过滤器不匹配怎么办?这是一个伤害的袋子。
Think about the result if it let you do this: in one case your MemberLink.MasterMember.ReceivedMessages
will be fully populated, on another identical looking object MemberLink.MasterMember.ReceivedMessages
is actually a sub-set of messages! What happens if you try to add to the ReceivedMessages? What if the addition doesn't match the filter? It is a bag of hurt.
答案是使用预测:
public IList<MemberLinkWithFiltereredMessages> GetMasterLinks(int p_MemberID)
{
return Get()
.Include(memberLink => memberLink.MasterMember)
.Include(memberLink => memberLink.SlaveMember)
.Where(memberLink => memberLink.MasterMember.RecordID == p_MemberID)
.Select(memberLink => new MemberLinkWithFilteredMessages
{
MemberLink = memberLink,
FilteredMessages = memberLink.MasterMember.ReceivedMessages
.Where(msg => msg.Sender.RecordID == memberLink.SlaveMember.RecordID)
})
.ToList();
}
你真正在做的是要求一个特定的信息子集,所以要明确。
What you are really doing is asking for a specific sub-set of information, so be explicit about it.
这篇关于实体框架。嵌套在.Include中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!