2011-02-10 9 views
10

Ho un'unità di lavoro e un repository che utilizza EF 4 e POCOs. Dal momento che EF richiede un set ordinato prima che possa Skip() e Take(), ho aggiunto il seguente test unitario (senza mock) solo per estrarre un record per vedere se ha funzionato.Aiutami a capire "LINQ alle entità supporta solo il cast dei tipi primitivi di Entity Data Model"

var myList = UOW.EntityRepo.Get(orderbyLambda: p => p.ID, page: 1, pageSize: 1); 

Ciò risulta in un'espressione di orderbyLambda = {p => Convert(p.ID)} e un errore durante l'enumerazione. L'ID è un tinyint (Int16/breve)

Quindi, perché non riesce a ordinare dall'ID? Più sull'errore

Unable to cast the type 'System.Int16' to type 'System.Object'.

ho definire l'orderbyLambda come Expression<Func<E, object>> orderbyLambda

EDIT:

il vero assassino è che se faccio questo:

orderbyLambda: p => new { p.ID } 

Funziona ... Perché?

risposta

15

Si individua "ordina per {oggetto}" e si lascia prendere dal panico; sa come ordinare per string, int, short, DateTime, ecc. - ma object è un po 'vago.

Avrete bisogno che il lambda effettivo sia digitato correttamente; l'approccio più semplice sarebbe quella di fare Get generico, vale a dire

.... Get<TIdentity>(
     Expression<Func<E, TIdentity>> orderbyLambda, int page, int pageSize) 

e poi:

orderbyLambda: p => p.ID 

dovrebbe (senza di te cambiare il codice al chiamante) effettuare automaticamente che un Get<short>(...) in questo caso tramite tipo generico inferenza. L'altra opzione è di lasciarlo come <E,object>, ma riscrivere l'albero delle espressioni sul ricevitore. Più lavoro.

+3

orderbyLambda: p => nuovo {p.ID} ha funzionato ... Molto interessante ... –

+5

Ho avuto un problema simile cercando di rendere OrderBy parte dell'API del repository. LINQ alle entità respinte con OrderBy (e => e.SomeCollection.Count). Anche la modifica dell'espressione in OrderBy (e => new {e.SomeCollection.Count}) ha funzionato per me. – danludwig

+0

+1 al commento di olivahour sopra, questo ha funzionato anche per me. – Beyers

Problemi correlati