2010-07-23 19 views
5

Ho cercato di utilizzare LINQ dinamico su Entity nella mia applicazione per specificare l'attributo OrderBy al runtime. Tuttavia quando si utilizza il codice come descritto nella maggior parte della documentazione:OrderBy ("it." + Sort) - Hard coding nel framework LINQ to Entity?

var query = context.Customer.OrderBy("Name"); 

ho ricevuto la seguente eccezione:

System.Data.EntitySqlException: 'Nome' non poteva essere risolto in ambito o contesto attuale . Assicurati che tutte le variabili di riferimento siano incluse nell'ambito, che gli schemi richiesti siano caricati e che gli spazi dei nomi siano referenziati correttamente.

Dopo molte ricerche ho trovato questo sito MSDN:

http://msdn.microsoft.com/en-us/library/bb358828.aspx

che includeva il seguente esempio di codice:

ObjectQuery<Product> productQuery2 = productQuery1.OrderBy("it.ProductID"); 

Questo mi ha spinto a cambiare il mio codice di seguito:

var query = context.Customer.OrderBy("it.Name"); 

Dopo questo il codice funziona perfettamente. Qualcuno potrebbe confermare che questo è davvero il modo corretto per far funzionare OrderBy con LINQ su Entity? Non posso credere che il quadro sarebbe stato implementato in questo modo, forse ho trascurato qualcosa?

Grazie, Matt

risposta

7

La sintassi it.Name è ESQL ed è specifica per EF. Ci sono buone ragioni per usarlo a volte (ad esempio, gli specificatori di regole di confronto), ma non è quello che faccio normalmente.

Di solito io uso espressioni standard di LINQ:

var query = context.Customer.OrderBy(p => p.Name); 

È anche possibile utilizzare System.Linq.Dynamic, se si scarica da Code Gallery, e quindi la query originale:

var query = context.Customer.OrderBy("Name"); 

. ..funzionerà.

+0

Grazie, proverò la libreria dinamica e vedrò se funziona. Sareste in grado di fornire un esempio quando sarebbe preferibile utilizzare la sintassi 'it'? Sembra accoppiare strettamente il tuo codice con un'implementazione su cui non hai alcun controllo. Cioè potrebbe cambiare e quindi rompere il tuo codice? Grazie, Matt – Matt

+0

IMHO, l'unica buona ragione per utilizzare ESQL su System.Linq.Dynamic è se è necessario utilizzare una delle poche funzionalità in ESQL che non sono disponibili in S.L.D., come le regole di confronto. Per lo più preferisco il S.L.D. –

1

No bel modo, finora

La mia risposta a questa domanda è stato quello di creare una stored procedure che ha parametro per controllare l'ordinamento.

Problemi correlati