Question

Is there a pattern using Linq to dynamically create a filter?

I have the need to create custom filtering on a list, in the past I would just dynamically create the SQL...it doesn't seem like this is possible with Linq.

Was it helpful?

Solution

Check out the Dynamic Linq Library from ScottGu's blog:

For example, below is a standard type-safe LINQ to SQL VB query that retrieves data from a Northwind database and displays it in a ASP.NET GridView control:

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

Using the LINQ DynamicQuery library I could re-write the above query expression instead like so

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

Notice how the conditional-where clause and sort-orderby clause now take string expressions instead of code expressions. Because they are late-bound strings I can dynamically construct them. For example: I could provide UI to an end-user business analyst using my application that enables them to construct queries on their own (including arbitrary conditional clauses).

OTHER TIPS

Dynamic Linq is one way to go.

It may be overkill for your scenario. Consider:

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

something like this?

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

that would create a sql statement like

SELECT * FROM Items [t0] where Name IN ('a','b','c')
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top