Esiste un modello che utilizza Linq per creare dinamicamente un filtro?
-
09-06-2019 - |
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.
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')