21

是否有使用 Linq 动态创建过滤器的模式?

我需要在列表上创建自定义过滤,过去我只是动态创建 SQL ......这似乎不适用于 Linq。

4

4 回答 4

19

查看 ScottGu 博客中的Dynamic Linq 库

例如,下面是一个标准类型安全的 LINQ to SQL VB 查询,它从 Northwind 数据库中检索数据并将其显示在 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()

使用 LINQ DynamicQuery 库,我可以像这样重写上面的查询表达式

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,使他们能够自行构建查询(包括任意条件子句)。

于 2008-08-27T18:57:46.367 回答
11

动态 Linq 是一种方法。

对于您的场景来说,这可能有点矫枉过正。考虑:

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();
于 2008-10-27T20:35:06.773 回答
5

动态组合表达式谓词

于 2008-08-27T19:13:00.230 回答
2

像这样的东西?

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

这将创建一个类似的 sql 语句

SELECT * FROM Items [t0] where Name IN ('a','b','c')
于 2008-08-27T18:58:48.780 回答