Domanda

Mi chiedo se ci sono alternative all'utilizzo della parola chiave Espandi quando si esegue una query LINQ to ADO.net Data Services. Il metodo di espansione mi consente di ottenere i dati a cui sono interessato, ma richiede che conosca tutti gli oggetti secondari con cui lavorerò in anticipo. La mia preferenza assoluta sarebbe che quegli oggetti secondari sarebbero caricati lentamente per me quando li accedo, ma questa non sembra essere un'opzione (potrei aggiungere questo caricamento pigro per ottenere quella proprietà dell'oggetto secondario, ma viene cancellato quando eseguo un aggiornamento del riferimento al servizio dati).

Qualcuno ha suggerimenti / migliori pratiche / alternative per questa situazione? Grazie.

===== Codice di esempio che utilizza Member che ha un MailingAddress =====

Funziona:

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

Preferirei (mi piacerebbe davvero che questo andasse e caricasse MailingAddress)

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

O almeno (nota: qualcosa di simile a questo, con MailingAddressReference, funziona sul lato server se lo faccio come LINQ to Entities in a Service Operation)

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);
È stato utile?

Soluzione

Il caricamento di oggetti secondari tramite ADO.net Data Services sembra avere due opzioni:

Caricamento desideroso

Compiuto da .Expand (" [MemberVariableName] ") sull'esempio di 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);

Caricamento lento

Realizzato chiamando .LoadProperty sul contesto e passandogli la variabile e la proprietà che dovrebbe essere caricata in modo pigro.

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

Altri suggerimenti

Con LINQ to Entities puoi anche utilizzare il Includi metodo . Puoi applicarlo dopo che è stato dichiarato ma prima che venga eseguito, ad es .:

me = me.Include("MailingAddress");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top