Was sind die Alternativen zur Verwendung von Expand in einer LINQ-zu-ADO.net-Datendienstabfrage?

entity-framework lazy-loading linq wcf-data-services

Frage

Ich frage mich, ob es Alternativen zur Verwendung des Schlüsselworts "Erweitern" gibt, wenn Sie eine LINQ-Abfrage mit ADO.net Data Services durchführen. Die Expand-Methode liefert mir zwar die Daten, die mich interessieren, aber ich muss alle Unterobjekte kennen, mit denen ich im Voraus arbeiten werde. Meine absolute Präferenz wäre, dass diese Unterobjekte für mich faul geladen wären, wenn ich auf sie zugreife. Dies scheint jedoch keine Option zu sein (ich könnte dieses langsame Laden zu dem Aufruf der Unterobjekteigenschaft hinzufügen, aber es ist wird gelöscht, wenn ich die Datendienstreferenz aktualisiere).

Hat jemand Vorschläge / Best Practices / Alternativen für diese Situation? Vielen Dank.

===== Beispielcode mit Member mit einer MailingAddress =====

Werke:

var me = (from m in ctx.Member.Expand("MailingAddress")
          where m.MemberID == 10000
          select m).First();
MessageBox.Show(me.MailingAddress.Street);

Wäre mir lieber (würde wirklich gerne, wenn das dann ging und die MailingAddress lud)

var me = (from m in ctx.Member
          where m.MemberID == 10000
          select m).First();
MessageBox.Show(me.MailingAddress.Street);

Oder zumindest (Anmerkung: Ähnliches funktioniert mit MailingAddressReference auf der Serverseite, wenn ich dies als LINQ to Entities in einer Service Operation mache.)

var me = (from m in ctx.Member
          where m.MemberID == 10000
          select m).First();
if (!(me.MailingAddress.IsLoaded())) me.MailingAddress.Load()
MessageBox.Show(me.MailingAddress.Street);

Akzeptierte Antwort

Das Laden von Unterobjekten über ADO.net Data Services scheint zwei Möglichkeiten zu haben:

Eifriges Laden

Wird von .Expand ("[MemberVariableName]") im LINQ to Data Services-Beispiel ausgeführt

var me = (from m in ctx.Member.Expand("MailingAddress")          
         where m.MemberID == 10000          
         select m).First();
MessageBox.Show(me.MailingAddress.Street);

Faules Laden

Erreicht durch Aufrufen von .LoadProperty für den Kontext und Übergeben der Variablen und der Eigenschaft, die verzögert geladen werden sollen

var me = (from m in ctx.Member          
          where m.MemberID == 10000          
          select m).First();
ctx.LoadProperty(myMember, "MailingAddresses");
MessageBox.Show(me.MailingAddress.Street);

Beliebte Antwort

Bei LINQ to Entities können Sie auch die Include-Methode verwenden . Sie können dies auf mich anwenden, nachdem es deklariert wurde, aber bevor es ausgeführt wird, zB:

me = me.Include("MailingAddress");


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum