是否存在使用Linq动态创建过滤器的模式?
我需要在列表上创建自定义过滤,过去我只是动态创建SQL ... Linq似乎无法实现。
从ScottGu的博客中查看Dynamic Linq库:
例如,下面是一个标准的类型安全的LINQ to SQL VB查询,该查询从Northwind数据库检索数据并将其显示在ASP.NET GridView控件中:
1 2 3 4 5
| 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() |
使用LINQ DynamicQuery库,我可以像这样重写上面的查询表达式
1 2 3 4
| Dim Northwind As New NorthwindDataContext
Dim query = Northwind.Products .where("CategoryID=2 And UnitPrice>3") . OrderBy("SupplierId")
Gridview1.DataSource = query
GridView1.DataBind() |
注意,conditional-where子句和sort-orderby子句现在如何使用字符串表达式而不是代码表达式。因为它们是后期绑定字符串,所以我可以动态地构造它们。例如:我可以使用我的应用程序向最终用户业务分析师提供UI,使他们能够自行构造查询(包括任意条件子句)。
动态Linq是一种解决方法。
对于您的情况而言,这可能是过大的选择。考虑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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(); |
动态组成表达谓词
这样的东西?
1 2 3 4
| var myList = new List<string> {"a","b","c" };
var items = from item in db.Items
where myList.Contains(item.Name)
select item; |
那会创建一个像
1
| SELECT * FROM Items [t0] where Name IN ('a','b','c') |