我正在尝试使用EF5代码优先执行数据库查找。基本结构和表关系如下;
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 ,看起来像;
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的调用,我试图在一次犯规中做到这一点。有谁知道如何在一个查询中实现这一目标?
我希望代码说明我正在尝试做什么......如果没有,我会尝试解释一下。
答案 0 :(得分:22)
简短的回答是否定的,EF不允许您使用Include()
。
考虑结果,如果它允许你这样做:在一种情况下,你的MemberLink.MasterMember.ReceivedMessages
将被完全填充,在另一个相同的查找对象上MemberLink.MasterMember.ReceivedMessages
实际上是一组消息!如果您尝试添加到ReceivedMessages会发生什么?如果添加与过滤器不匹配怎么办?这是一袋伤害。
答案是使用预测:
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();
}
你真正在做的是要求一个特定的信息子集,所以要明确它。