Domanda

Esiste un modello che utilizza Linq per creare dinamicamente un filtro?

Ho la necessità di creare filtri personalizzati su un elenco, in passato creavo semplicemente dinamicamente l'SQL... non sembra che ciò sia possibile con Linq.

È stato utile?

Soluzione

Dai un'occhiata a Libreria Linq dinamica dal blog di ScottGu:

Di seguito, ad esempio, è riportata una query LINQ to SQL VB standard indipendente dai tipi che recupera i dati da un database Northwind e li visualizza in un controllo 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()

Utilizzando la libreria LINQ DynamicQuery potrei invece riscrivere l'espressione di query sopra in questo modo

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

Si noti come la clausola condizionale-where e la clausola sort-orderby ora accettano espressioni di stringa anziché espressioni di codice.Poiché sono stringhe ad associazione tardiva, posso costruirle dinamicamente.Per esempio:Potrei fornire l'interfaccia utente a un analista aziendale dell'utente finale utilizzando la mia applicazione che consente loro di costruire query autonomamente (comprese clausole condizionali arbitrarie).

Altri suggerimenti

Dynamic Linq è una strada da percorrere.

Potrebbe essere eccessivo per il tuo scenario.Prendere in considerazione:

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();

qualcosa come questo?

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

ciò creerebbe un'istruzione SQL come

SELECT * FROM Items [t0] where Name IN ('a','b','c')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top