2010-06-15 5 views
6

che sto appena iniziato con EF e una query come la seguente mi sembra strano:Metodi di generazione query del framework Entity: perché "it" e non lambdas?

var departmentQuery = 
       schoolContext.Departments.Include("Courses"). 
       OrderBy("it.Name"); 

In particolare, ciò che sporge per me è "it.Name." Quando stavo lavorando con LINQ a SQL, praticamente ogni filtro in una query query-builder poteva essere specificato con un lambda, come, in questo caso, d => d.Name.

Vedo che esistono degli override di OrderBy che accettano lambda che restituiscono un IOrderedQueryable o un IOrderedEnumable, ma ovviamente non hanno il metodo Execute necessario per ottenere ObjectResult che può quindi essere databound.

Mi sembra strano dopo tutto quello che ho letto su come lambda abbia un senso per questo tipo di cose, e come siano tradotte in alberi di espressione e poi in una lingua target - perché devo usare " it.Name "?

+0

Un altro esempio potrebbe essere. Dove ("it.SomeProperty non è null"). Ora ho questo strano miscuglio di operatori di query standard rappresentati in C# nativo con un filtro esplicito che vive interamente in TSQL-land. Pensavo che il punto di EF fosse quello di andarsene. – nlawalker

risposta

2

Ricevo espressioni di lamdba con le mie; Posso fare Where (it.SomeProperty == 1) ... hai System.Linq come spazio dei nomi? Puoi provare a ristrutturare come:

var departmentQuery = da d in schoolContext.Departments.Include ("Courses") orderby d.Name select d;

Queste sono alcune possibilità.

HTH.

+0

Interessante. Vedo che hai ragione nel fatto che funziona ancora - Ho solo bisogno di impostare il DataSource del mio GridView su departmentQuery invece di departmentQuery.Execute (MergeOptions.Whatever), perché ora è un IQueryable o IOrderedQueryable invece di un ObjectQuery e quindi non ha un metodo Execute. Stando così le cose, sembra che mi manca l'impostazione di MergeOption. Suppongo che in questo caso usi solo l'impostazione predefinita? – nlawalker

+0

Bene, anche con IQueryable dovresti essere in grado di usare i lambda; purché sia ​​il modulo generico, altrimenti è necessario chiamare Cast () sulla raccolta per ottenere il tipo generico. Questo però può usare LINQ per oggetti invece di L2E. IQueryable è l'interfaccia ed è implementata anche da ObjectQuery, FYI. –

+0

Quello che sto dicendo è che usare un lambda in qualcosa di simile a Where o OrderBy ti restituisce un IQueryable, * not * un ObjectQuery. Prova a chiamare Where su ObjectSet o ObjectQuery e guarda gli overload con Intellisense - quelli che accettano Expression > restituiscono un IQueryable e quelli che accettano Func <> restituiscono un oggetto IEnumerable. L'unico modo per ottenere un ObjectQuery è chiamare il sovraccarico che richiede (string, params ObjectParameter []). Tutto ciò detto, ora sto vedendo che è possibile tornare a un ObjectQuery e riottenere l'accesso a Execute(). Contrassegnare come risposta per l'utile chat, grazie. – nlawalker

Problemi correlati