2010-05-22 15 views
20

qual è la differenza tra loadwith e associatewith. Dagli articoli che ho letto sembra che loadwith venga utilizzato per caricare dati aggiuntivi (ad esempio tutti gli ordini per i clienti). Mentre AssociateWith viene utilizzato per filtrare i dati.da linq a sql loadwith vs associate con

È una comprensione corretta? Inoltre sarà bello se qualcuno può spiegare questo con una spiegazione basata su un esempio.

risposta

30

LoadWith viene utilizzato per eseguire un carico ansioso di un'associazione in contrasto predefinito pigrizia carico.

Normalmente, le associazioni vengono caricate la prima volta che le si fa riferimento. Ciò significa che se selezioni 100 Order istanze e poi fai qualcosa con ciascuna delle loro Details, stai effettivamente eseguendo 101 operazioni SELECT contro il database. D'altra parte, se lo LoadOptions specifica LoadWith<Order>(o => o.Details), allora è tutto fatto in un unico SELECT con un JOIN aggiunto.

AssociateWith non ha alcun effetto sulla quando l'associazione viene caricato, proprio quello che viene caricato. Aggiunge una clausola WHERE ogni volta che si carica un'associazione.

Come dici tu, viene utilizzato per automaticamente dati di filtro. Normalmente lo useresti se sai che un'associazione ha un numero molto grande di elementi e hai solo bisogno di un sottoinsieme specifico di essi. Di nuovo, è principalmente un ottimizzazione delle prestazioni, solo un tipo diverso.

+6

Questa riga ha chiarito per me "AssociateWith non ha alcun effetto su quando viene caricata l'associazione, solo su cosa viene caricato". Grazie. – stackoverflowuser

7

Sì, la vostra comprensione è corretta; AssociateWith filtra i dati prima delle query, mentre LoadWith restituisce gli oggetti associati nella query. Il motivo per cui è stato creato LoadWith è che è possibile restituire gli oggetti associati in una singola query. Altrimenti, le chiamate extra DB verranno effettuate nel momento in cui si itera su oggetti associati.

Provate diversi esempi e date un'occhiata all'SQL generato tramite Profiler o qualche altro logger. Ricorda che queste opzioni devono essere impostate su DataContext prima di eseguire qualsiasi query.

Dai un'occhiata agli esempi nei link sottostanti (MSDN). Ho appena copiato gli esempi che usano lì.

LoadWith

DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<Customer>(c => c.Orders); 
db.LoadOptions = dlo; 

var londonCustomers = from cust in db.Customers 
         where cust.City == "London" 
         select cust; 

AssociateWith

DataLoadOptions dlo = new DataLoadOptions(); 
dlo.AssociateWith<Customer>(
    c => c.Orders.Where(p => p.ShippedDate != DateTime.Today)); 
db.LoadOptions = dlo; 

var custOrderQuery = from cust in db.Customers 
        where cust.City == "London" 
        select cust;