2010-06-15 8 views
6

estoy acaba de empezar con EF y una consulta como la siguiente me parece extraña:Métodos del generador de consultas de Entity Framework: ¿por qué "it" y no lambdas?

var departmentQuery = 
       schoolContext.Departments.Include("Courses"). 
       OrderBy("it.Name"); 

En concreto, lo que se pega a mí es "it.Name." Cuando estaba trabajando con LINQ to SQL, casi todos los filtros en una consulta query-builder podían especificarse con una lambda, como, en este caso, d => d.Name.

Veo que hay reemplazos de OrderBy que toman lambdas que devuelven un IOrderedQueryable o un IOrderedEnumable, pero obviamente estos no tienen el método Execute necesario para obtener el ObjectResult que luego puede ser databound.

Después de todo, me parece extraño que las lambdas tengan tanto sentido para este tipo de cosas, y cómo se traducen en árboles de expresiones y luego en un idioma de destino, ¿por qué debo usarlo? su nombre"?

+0

Otro ejemplo sería .Where ("it.SomeProperty no es nulo"). Ahora tengo esta extraña mezcolanza de operadores de consultas estándar representados en C# nativo junto con un filtro explícito que vive completamente en TSQL-land. Pensé que el objetivo de EF era alejarse de esto. – nlawalker

Respuesta

2

obtengo expresiones de lamdba con la mía; Puedo hacer Where (it.SomeProperty == 1) ... ¿tiene System.Linq como espacio de nombres? Usted puede tratar de reestructuración como:

var = departmentQuery de d en schoolContext.Departments.Include ("Cursos") OrdenarPor d.Name seleccione d;

Estas son algunas posibilidades.

HTH.

+0

Interesante. Veo que tiene razón en que todavía funciona, solo tengo que configurar el DataSource de mi GridView en departmentQuery en lugar de departmentQuery.Execute (MergeOptions.Whatever), porque ahora es un IQueryable o IOrderedQueryable en lugar de un ObjectQuery, por lo que no tiene un método Execute. Siendo ese el caso, parece que me estoy perdiendo la configuración de MergeOption. Supongo que solo utiliza el valor predeterminado en este caso? – nlawalker

+0

Bueno, incluso con IQueryable deberías poder usar las lambdas; siempre que sea el formulario genérico; de lo contrario, debe llamar al Cast () en la colección para obtener el tipo genérico. Sin embargo, esto puede usar LINQ para objetos en lugar de L2E. IQueryable es la interfaz y también lo implementa ObjectQuery, FYI. –

+0

Lo que estoy diciendo es que el uso de un lambda en algo como Where o OrderBy te devuelve un IQueryable, * not * a ObjectQuery. Trate de llamar Cuando en una ObjectSet o ObjectQuery y mirar las sobrecargas con Intellisense - los que toman Expresión > volver IQueryable y los que toman un Func <> devolver un IEnumerable. La única forma de recuperar un ObjectQuery es llamar a la sobrecarga que toma (string, params ObjectParameter []). Dicho todo esto, ahora veo que puede volver a un ObjectQuery y recuperar el acceso a Execute(). Marcado como respuesta para el chat útil, thx. – nlawalker

Cuestiones relacionadas