2012-12-18 13 views
5

Ho preso il controllo di qualche codice di entità framework e sto cercando di refactoring. Prima di farlo, vorrei verificare se i miei pensieri sono corretti e non mi manca il modo di fare le cose a livello di entità.Refactoring livello dati

Esempio 1 - Subquery vs Registrati

qui abbiamo un uno-a-molti tra As e breakfast. A parte il codice che segue è difficile da leggere, è anche inefficiente?

from a in dataContext.As 
where ((from b in dataContext.Bs 
     where b.Text.StartsWith(searchText) 
     select b.AId).Distinct()).Contains(a.Id) 
select a 

Sarebbe meglio, ad esempio, utilizzare il join e fare qualcosa del genere?

from a in dataContext.As 
where a.Bs.Any(b => b.Text.StartsWith(searchText)) 
select a 

Esempio 2 - esplicita unisce vs navigazione

Qui abbiamo un uno-a-molti tra As e B e un uno-a-molti tra B e Cs.

from a in dataContext.As 
join b in dataContext.Bs on b.AId equals a.Id 
join c in dataContext.Cs on c.BId equals b.Id 
where c.SomeValue equals searchValue 
select a 

C'è una buona ragione per utilizzare join espliciti piuttosto che navigare nel modello di dati? Per esempio:

from a in dataContext.As 
where a.Bs.Any(b => b.Cs.Any(c => c.SomeValue == searchValue) 
select a 

risposta

0

a volte è necessario utilizzare lo stile di join e sottoquery per ottenere il controllo su alcuni aspetti di una query LINQ 2 SQL. Questo non è il caso qui. Lo stile di "navigazione" è strettamente preferibile. A volte, ha persino dei vantaggi in termini di prestazioni, perché LINQ to SQL utilizza modelli SQL più intelligenti.

Non voglio solo rispondere con "hai ragione", quindi lasciami dire che ho un sacco di esperienza con LINQ to SQL. Lo sto utilizzando su due progetti più grandi in cui le prestazioni sono critiche e quasi tutte le istruzioni SQL generate sono state testate da me. Quindi questa risposta ha una certa autorità e non è solo un'opinione internet casuale.

+0

Grazie per aver trovato il tempo di rispondere. – Joey