sintaxis - Creación de consultas LINQ dinámicas basadas en el valor de Combobox
ordenar en linq (3)
Scott Guthrie tiene una breve serie sobre consultas dinámicas LINQ a SQL:
Esa es la manera fácil ... entonces hay otra manera que está un poco más involucrada:
Tengo un cuadro combinado en Silverlight. Tiene una colección de valores construidos a partir de las propiedades de uno de mis objetos LINQ-to-SQL (es decir, Nombre, Dirección, Edad, etc.). Me gustaría filtrar mis resultados según el valor seleccionado en un cuadro combinado.
Ejemplo: Digamos que quiero que todos tengan el apellido "Smith". Seleccionaría ''Apellido'' de la lista desplegable e ingresaría a smith en un control de cuadro de texto. Normalmente escribiría una consulta LINQ similar a ...
var query = from p en la colección
donde p.LastName == textbox.Text
seleccione p;
¿Es posible decidir la propiedad dinámicamente, tal vez usando Reflection? Algo como
var query = from p en la colección
donde p. (DropDownValue) == textbox.Text
seleccione p;
Asumiendo:
public class Person
{
public string LastName { get; set; }
}
IQueryable<Person> collection;
su consulta:
var query =
from p in collection
where p.LastName == textBox.Text
select p;
significa lo mismo que:
var query = collection.Where(p => p.LastName == textBox.Text);
que el compilador traduce de un método de extensión a:
var query = Queryable.Where(collection, p => p.LastName == textBox.Text);
El segundo parámetro de Queryable.Where
es una Expression<Func<Person, bool>>
. El compilador entiende el tipo Expression<>
y genera código para construir un árbol de expresiones que representa el lambda:
using System.Linq.Expressions;
var query = Queryable.Where(
collection,
Expression.Lambda<Func<Person, bool>>(
Expression.Equal(
Expression.MakeMemberAccess(
Expression.Parameter(typeof(Person), "p"),
typeof(Person).GetProperty("LastName")),
Expression.MakeMemberAccess(
Expression.Constant(textBox),
typeof(TextBox).GetProperty("Text"))),
Expression.Parameter(typeof(Person), "p"));
Eso es lo que significa la sintaxis de consulta.
Usted es libre de llamar a estos métodos usted mismo. Para cambiar la propiedad comparada, reemplace esto:
typeof(Person).GetProperty("LastName")
con:
typeof(Person).GetProperty(dropDown.SelectedValue);
También puede usar la biblioteca que creé: http://tomasp.net/blog/dynamic-linq-queries.aspx . Debería almacenar las propiedades en ComboBox como expresiones lambda y luego simplemente escribir:
var f = (Expression<Func<Product, string>>)comboBox.SelectedValue;
var query =
from p in collection
where f.Expand(textBox.Text)
select p;