¿Hay algún patrón que use Linq para crear dinámicamente un filtro?

¿Hay algún patrón que use Linq para crear dinámicamente un filtro?

Tengo la necesidad de crear filtros personalizados en una lista, en el pasado simplemente creaba dinámicamente el SQL … no parece que esto sea posible con Linq.

Consulte la Biblioteca de Dynamic Linq del blog de ScottGu:

Por ejemplo, a continuación se muestra una consulta estándar LINQ to SQL VB de tipo seguro que recupera datos de una base de datos Northwind y los muestra en un control ASP.NET GridView:

Dim Northwind As New NorthwindDataContext Dim query = From q In Northwind.Products Where p.CategoryID = 2 And p.UnitPrice > 3 Order By p.SupplierID Select p Gridview1.DataSource = query GridView1.DataBind() 

Utilizando la biblioteca de LINQ DynamicQuery pude volver a escribir la expresión de consulta anterior como si fuera

 Dim Northwind As New NorthwindDataContext Dim query = Northwind.Products .where("CategoryID=2 And UnitPrice>3") . OrderBy("SupplierId") Gridview1.DataSource = query GridView1.DataBind() 

Observe cómo la cláusula condicional-where y la cláusula sort-orderby ahora toman expresiones de cadena en lugar de expresiones de código. Debido a que son cadenas atadas tardíamente, puedo construirlas dinámicamente. Por ejemplo: podría proporcionar UI a un analista de negocios de usuario final usando mi aplicación que les permite construir consultas por sí mismos (incluidas cláusulas condicionales arbitrarias).

Dynamic Linq es una forma de hacerlo.

Puede ser excesivo para su escenario. Considerar:

 IQueryable query = db.Customers; if (searchingByName) { query = query.Where(c => c.Name.StartsWith(someletters)); } if (searchingById) { query = query.Where(c => c.Id == Id); } if (searchingByDonuts) { query = query.Where(c => c.Donuts.Any(d => !d.IsEaten)); } query = query.OrderBy(c => c.Name); List = query.Take(10).ToList(); 

Pronósticos de expresión que componen dinámicamente

¿algo como esto?

 var myList = new List { "a","b","c" }; var items = from item in db.Items where myList.Contains(item.Name) select item; 

eso crearía una statement sql como

 SELECT * FROM Items [t0] where Name IN ('a','b','c')