Quelles sont les alternatives à l'utilisation de Expand dans une requête de service de données LINQ to ADO.net?

StackOverflow https://stackoverflow.com/questions/177520

Question

Je me demande s’il existe une alternative à l’utilisation du mot clé Expand lorsque vous exécutez une requête LINQ to ADO.net Data Services. La méthode expand me fournit les données qui m'intéressent, mais elle nécessite que je connaisse tous les sous-objets avec lesquels je vais travailler à l'avance. Ma préférence absolue serait que ces sous-objets soient chargés paresseux lorsque je les accède, mais cela ne semble pas être une option (je pourrais ajouter ce chargement paresseux à la propriété get sur cette sous-objet, mais est effacé lorsque je fais une mise à jour de la référence de service de données).

Quelqu'un at-il des suggestions / meilleures pratiques / alternatives pour cette situation? Merci.

===== Exemple de code utilisant Member dont l'adresse mailingAddress =====

Fonctionne:

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

Est-ce que je préférerais (j'aimerais vraiment que cela soit ensuite chargé et chargé dans MailingAddress)

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

Ou du moins (remarque: quelque chose de similaire à cela, avec MailingAddressReference, fonctionne côté serveur si je le fais en tant que LINQ aux entités dans une opération de service)

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);
Était-ce utile?

La solution

Chargement de sous-objets via ADO.net Data Services semble avoir deux choix:

Chargement enthousiaste

Accompli par .Expand ("[[MemberVariableName]]") dans l'exemple LINQ to Data Services

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

Chargement paresseux

Accompli en appelant .LoadProperty sur le contexte et en lui transmettant la variable et la propriété qui doit être chargée paresseuse.

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

Autres conseils

Avec LINQ to Entities, vous pouvez également utiliser la méthode Include . . Vous pouvez l'appliquer à moi après sa déclaration mais avant son exécution, par exemple:

me = me.Include("MailingAddress");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top