7

Estoy construyendo una aplicación ASP.Net MVC 3 con Entity Framework 4. Cuando las dos piezas de código a continuación se ejecutan, ambas variables (QUERY1 y QUERY2) tienen un tipo de retorno deLINQ Consulta dinámica Biblioteca

System.Data.Objects.ObjectQuery<Asset.Model.Equipment> 

Query1 utiliza una instancia directa de ObjectContext, sin embargo, Query2 usa un patrón de repositorio, es decir, llama a GetEquipment en EquipmentService, que a su vez llama al mismo método nombrado en el Repositorio de equipos. Tanto los métodos en el servicio y el retorno Repositorio

IQueryable<Equipment> 

Cómo, aquí está mi pregunta, ¿cómo es que consulta2 sólo funcionará cuando se incluyo

using System.Linq.Dynamic; 

En la parte superior de mi controlador de

using (AssetEntities context = new AssetEntities()) 
     { 
      var query1 = context.Equipments 
      .OrderBy("it." + sidx + " " + sord) 
      .Skip(pageIndex * pageSize) 
      .Take(pageSize); 
     } 


     var query2 = equipService.GetEquipment() 
      .OrderBy(sidx + " " + sord) 
      .Skip(pageIndex * pageSize) 
      .Take(pageSize); 

Si omito System.Linq.Dynamic desde mi controlador, aparece un error en Query2 en

.OrderBy(sidx + " " + sord) 

Que establece

The type arguments for method 'System.Linq.Queryable.OrderBy<TSource,TKey>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,TKey>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly 

¿Alguien sabe por qué consulta1 puede trabajar sin tener que utilizar System.Linq.Dynamic, pero que consulta2 lo necesita para ejecutar?

Gracias a todos.

Respuesta

6

En la primera consulta context.Equipments tiene tipo ObjectQuery<Equipment>. El ObjectQuery<T> tiene el método OrderBy(string) que se necesita para .OrderBy("it." + sidx + " " + sord). Entonces la primera consulta funciona.

En la segunda consulta utiliza equipService.GetEquipment() del tipo IQueryable<Equipment>. El IQueryable<T> tiene solo el método de extensión OrderBy con Expression<Func<T, TKey>> como parámetro en lugar de string. Así que para usar con OrderByIQueryable<Equipment> usted tiene que escribir algo como

equipService.GetEquipment().OrderBy(e => e.equipmentID) 

pero no es lo que usted puede utilizar. Para que necesite otro método de extensión, que puede proporcionarle la biblioteca LINQ Dynamic Query en el formulario System.Linq.Dynamic.

En muchos casos LINQ a Entidades tiene many restrictions, pero en su caso tiene más ventajas que LINQ a SQL. Por lo tanto, le recomiendo que se quede con LINQ en Entidades en su caso. Estoy seguro de que en la forma en que recibirá el mejor rendimiento debido al soporte nativo de todas las funciones directamente en el Entity Framework que utiliza.

Debido LINQ a Entidades o ObjectQuery<Equipment> apoya Where(string) método (a ser exactamente ObjectQuery.Where(string predicate, params ObjectParameter[] parameters) método) se puede poner en práctica relativamente fácil de filtrado/búsqueda en jqGrid.El uso de .Where puede ser

.Where("it.equipmentID < 100") 

o

.Where("it.equipmentID < @maxId", new ObjectParameter ("maxId", 100)) 

por ejemplo (el uso de "Maxid" en lugar de "@maxId" en el ObjectParameter no se error de escritura).

ACTUALIZADO: En "ACTUALIZACIÓN" parte de the answer usted puede encontrar the example que muestra cómo implementar el filtrado/búsqueda en jqGrid basado en la idea de lo que he descrito anteriormente.

+0

Esta es una excelente respuesta. Gracias por su tiempo :) – tgriffiths

+0

@tgriffiths: En [la respuesta] (http://stackoverflow.com/questions/5500805/asp-net-mvc-2-0-implementation-of-searching-in-jqgrid/5501644# 5501644) Muestro cómo implementar filtrado/búsqueda en jqGrid que se puede usar para [buscar en la barra de herramientas] (http://www.trirand.com/jqgridwiki/doku.php?id=wiki:toolbar_searching) y [búsqueda avanzada] (http://www.trirand.com/jqgridwiki/doku.php?id=wiki:advanced_searching). Actualicé mi respuesta con los enlaces correspondientes. – Oleg

4

"it" es el valor predeterminado de la propiedad ObjectQuery.Name. De hecho, cuando usa la primera consulta, realiza una cláusula Entity SQL Order By implícita, mientras que en la segunda utiliza LINQ to Entities y necesita el espacio de nombres System.Linq.Dynamic para funcionar correctamente.

Cuestiones relacionadas