【问题标题】:Is there a pattern using Linq to dynamically create a filter?是否有使用 Linq 动态创建过滤器的模式?
【发布时间】:2010-09-07 01:11:31
【问题描述】:

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

我需要在列表上创建自定义过滤,过去我只是动态创建 SQL...Linq 似乎无法做到这一点。

【问题讨论】:

    标签: linq linq-to-sql .net-3.5


    【解决方案1】:

    查看 ScottGu 博客中的 Dynamic Linq Library

    例如,下面是一个标准类型安全的 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,使他们能够自行构建查询(包括任意条件子句)。

    【讨论】:

    • 这行得通吗?我明白了:错误 28 重载解析失败,因为无法使用这些参数调用可访问的“OrderBy”:无法从这些参数推断类型参数的数据类型。明确指定数据类型可能会更正此错误。我在 .OrderBy 子句中看不到“字符串”作为参数选项。
    • @JohnnyBizzle - 它有效。我在许多项目中使用它。仔细检查 dynamic.cs 是否在您的项目中,并且您在 using 声明中正确引用了它。
    • 那太好了。我从来不知道你能做到这一点。这将解决我的高级搜索查询构建问题。不错的一个+1
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      【解决方案4】:

      这样的?

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

      【讨论】:

      • 有趣的概念,但有点混乱
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 2022-06-24
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多