Entity Framework .Wo verschachtelt .Gehören
Bin ich der Versuch, einen db-lookup über EF5-code-ersten. Die grundlegende Struktur und die Tabelle-Beziehungen sind wie folgt;
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.
}
Nun die Abfrage, die ich versuche zu führen, ist die Verwendung des MemberLinkRepository, und sieht aus wie;
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();
Außer EF scheint nicht, wie die verschachtelten Wo. Ich könnte aufgeteilt in 2 separate repository aufruft (und in der Tat, sieht es wie ich zu tun haben könnte, dass), aber im Interesse der Verringerung der Aufrufe der db-ich bin versucht, es zu tun in einer üblen Streich. Weiß jemand, wie ich erreichen kann das in einer einzigen Abfrage?
Ich hoffe, der code zeigt was ich zu tun versuche... Wenn nicht, werde ich versuchen und erklären, ein wenig besser.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die kurze Antwort ist Nein, EF-lassen Sie nicht zu, dass die Verwendung
Include()
.Denken, das Ergebnis, wenn es lassen Sie dies tun: in einem Fall Ihre
MemberLink.MasterMember.ReceivedMessages
wird vollständig aufgefüllt ist, auf ein anderes identisch aussehenden ObjektMemberLink.MasterMember.ReceivedMessages
ist eigentlich ein sub-Satz von Nachrichten! Was passiert, wenn Sie versuchen, hinzufügen, um die ReceivedMessages? Was ist, wenn der Zusatz nicht dem filter entsprechen? Es ist eine Tasche von Verletzten.Die Antwort ist die Verwendung von Projektionen:
Was Sie wirklich tun, ist zu Fragen, für ein bestimmtes sub-set von Informationen, so explizit über ihn.