2011-02-10 9 views
10

Tengo una unidad de trabajo y un repositorio que usa EF 4 y POCOs. Como EF requiere un conjunto ordenado antes de que pueda Omitir() y Tomar(), agregué la siguiente prueba unitaria (sin simulaciones) solo para extraer un registro y ver si funcionaba.Ayúdame a comprender "LINQ to Entities only supports casting Entity Data Model tipos primitivos"

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

Esto da como resultado una expresión de orderbyLambda = {p => Convert(p.ID)} y un error durante la enumeración. El ID es tinyint (Int16/short)

Entonces, ¿por qué esto no ordena por ID? Más información sobre el error

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

que definen el orderbyLambda como Expression<Func<E, object>> orderbyLambda

EDIT:

El verdadero asesino es si hago esto:

orderbyLambda: p => new { p.ID } 

Funciona ... ¿Por qué?

Respuesta

15

Detecta "orden por {objeto}" y entra en pánico; sabe cómo ordenar por string, int, short, DateTime, etc. - pero object es un poco demasiado vago.

Va a necesitar que la lambda real se escriba correctamente; el enfoque más sencillo sería hacer Get genérico, es decir,

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

y luego:

orderbyLambda: p => p.ID 

debe (y sin que cambiar el código en la persona que llama) hacer automáticamente que un Get<short>(...) en este caso a través de tipo genérico inferencia. La otra opción es dejarlo como <E,object>, pero vuelva a escribir el árbol de expresiones en el receptor. Mas trabajo.

+3

orderbyLambda: p => new {p.ID} funcionó ... Muy interesante ... –

+5

Tuve un problema similar al tratar de hacer que OrderBy fuera parte de mi API de repositorio. LINQ to Entities se negó en OrderBy (e => e.SomeCollection.Count). Cambiar la expresión a OrderBy (e => new {e.SomeCollection.Count}) también funcionó para mí. – danludwig

+0

+1 al comentario anterior de olivehour, esto funcionó para mí también. – Beyers

Cuestiones relacionadas