tutorial sintaxis ordenar framework expresiones español ejemplos consultas consulta comandos buscar linq silverlight linq-to-sql dynamic-linq

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:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Esa es la manera fácil ... entonces hay otra manera que está un poco más involucrada:

http://www.albahari.com/nutshell/predicatebuilder.aspx

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;