Quali sono le alternative all'utilizzo di Espandi in una query del servizio dati LINQ to ADO.net?
-
05-07-2019 - |
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);
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");