2011-12-13 21 views
5

He estado luchando para que esto funcione. Deseo hacer una declaración de EF en una columna para ordenar por. Mi declaración original era la siguiente:Entity Framework y orden dinámica por declaraciones

var Query = from P in DbContext.People 
        where P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId) 
        orderby P.LastName 
        select P; 

Y cambió esto a lo siguiente:

var Query = from P in DbContext.People 
        where P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId) 
        orderby sortField 
        select P; 

Dónde sortField es la columna que desea ordenar en, y es una cadena decir LastName. Sin embargo, no parece funcionar, no ordena, y la cadena de SQL de salida está completamente equivocada. ¿Alguien consiguió esto trabajando antes?

Respuesta

11

usted podría intentar pasar en una expresión para el método con el siguiente tipo:

Expression<Func<Person, object>> expr = p => p.LastName; 

y luego usar las extensiones de LINQ en lugar de expresiones LINQ ...

var Query = 
DbContext.People 
.Where(P => P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId)) 
.OrderBy(expr) 
.ToList(); 
+0

excelente respuesta, en este caso particular, esto parece una mejor solución así que voy a usar esto, gracias. – eyeballpaul

+0

¿Hay alguna manera de agregar una cláusula "asc" y "desc" aquí? – eyeballpaul

+0

Además, ¿por qué funciona esto con propiedades de cadena y no enteros? Una de las propiedades es un Int32, y cuando intento ordenar en ese orden, aparece el error: "{" No se puede convertir el tipo 'System.Int32' para escribir 'System.Object'. LINQ to Entities solo admite el moldeado de tipos primitivos de Entity Data Model. "}" – eyeballpaul

3

Su especie no funciona porque está ordenando un literal de cadena. No es ilegal, pero tampoco es particularmente útil. Es necesario proporcionar un campo de clasificación a través de la API de IQueryable<T>, por ejemplo, así:

var q = from P in DbContext.People 
    where P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId) 
    orderby P.LastName 
    select P; 
if ("sortField".Equals("FirstName")) 
    q = q.OrderBy(p => p.FirstName); 
else if ("sortField".Equals("LastName")) 
    q = q.OrderBy(p => p.LastName); 
else if ("sortField".Equals("Dob")) 
    q = q.OrderBy(p => p.Dob); 
+0

Buena respuesta. En este caso particular, estoy usando la respuesta de BobTodd, sin embargo, tendré esto en cuenta para algunas de las consultas dinámicas que construiré próximamente. – eyeballpaul