2010-07-23 18 views
5

He intentado utilizar LINQ dinámico para Entity en mi aplicación para especificar el atributo OrderBy en el tiempo de ejecución. Sin embargo cuando se utiliza el código como se describe en la mayor parte de la documentación:OrderBy ("it." + Sort) - ¿Codificación dura en LINQ to Entity framework?

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

que recibió la siguiente excepción:

System.Data.EntitySqlException: 'Nombre' no pudo ser resuelto en el ámbito o contexto actual . Asegúrese de que todas las variables referenciadas estén dentro del alcance, que los esquemas requeridos estén cargados, y que los espacios de nombres estén referenciados correctamente.

Después de mucho buscar encontré esta página de MSDN:

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

que incluía el siguiente ejemplo de código:

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

Esto me impulsó a cambiar el código para lo siguiente:

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

Después de esto, el código funciona a la perfección. ¿Alguien podría confirmar que esta es la forma correcta de hacer que OrderBy trabaje con LINQ to Entity? No puedo creer que el marco se hubiera implementado de esta manera, tal vez he pasado por alto algo?

Gracias, Matt

Respuesta

7

La sintaxis it.Name es ESQL y es específica de EF. Hay buenas razones para usar esto a veces (por ejemplo, especificadores de intercalación), pero no es lo que normalmente hago.

Por lo general utilizan expresiones LINQ estándar:

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

También puede utilizar System.Linq.Dynamic, si se descarga desde Galería de código, y luego su búsqueda original:

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

. ..trabajará.

+0

Gracias, probaré la lib dinámica y veré si eso funciona. ¿Sería capaz de dar un ejemplo cuando sería preferible usar la sintaxis 'it'? Parece unir estrechamente tu código con una implementación sobre la que no tienes control. Es decir. podría cambiar y así romper tu código? Gracias, Matt – Matt

+0

En mi humilde opinión, la única buena razón para utilizar ESQL sobre System.Linq.Dynamic es si necesita utilizar una de las pocas funciones en ESQL que no están disponibles en S.L.D., como intercalaciones. Mayormente prefiero S.L.D. –

1

ninguna manera agradable, hasta ahora

Mi respuesta a esta pregunta era crear un procedimiento almacenado que tiene parámetro para controlar la clasificación.

Cuestiones relacionadas