Pregunta

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

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

¿Fue útil?

Solución

Revisar la Biblioteca dinámica Linq del blog de ScottGu:

Por ejemplo, a continuación se muestra una consulta LINQ to SQL VB estándar con seguridad de tipos 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()

Usando la biblioteca LINQ DynamicQuery, podría reescribir la expresión de consulta anterior así

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 dónde y la cláusula ordenar por ahora toman expresiones de cadena en lugar de expresiones de código.Como son cadenas de enlace tardío, puedo construirlas dinámicamente.Por ejemplo:Podría proporcionar una interfaz de usuario a un analista de negocios usuario final utilizando mi aplicación que les permita crear consultas por su cuenta (incluidas cláusulas condicionales arbitrarias).

Otros consejos

Dynamic Linq es un camino a seguir.

Puede que sea excesivo para su escenario.Considerar:

IQueryable<Customer> 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<Customer> = query.Take(10).ToList();

¿algo como esto?

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

eso crearía una declaración SQL como

SELECT * FROM Items [t0] where Name IN ('a','b','c')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top