【问题标题】:What is the best approach to build dynamic LINQ queries?构建动态 LINQ 查询的最佳方法是什么?
【发布时间】:2009-11-23 23:05:51
【问题描述】:

感谢那些回答我最后几个问题的人,我得到了以下代码工作,它允许您将Where子句集合发送到一个方法附加到 LINQ 查询。这将适用于我需要的手头案例。

但是,扩展这样的最佳方法是什么:

  • OrderBy子句可以发送
  • Where 子句可以与“OR”逻辑组合,而不仅仅是“AND”逻辑
  • 其他选项可以动态发送,例如发回的对象中包含哪些字段(例如,在下面的示例中,它不必总是客户)

基本上,这样做的背景是能够从这个表单解析的配置文件或用户输入动态构建 LINQ 查询。

这个任务让我想起了构建可以基于参数动态生成 SQL 语句的类,但这涉及构建一个更直接的 字符串(SQL 语句)而不是动态构建 LINQ 查询。

关于这个主题有很多 Stackoverflow 问题和 blog posts,但它们似乎都是针对个别问题的单独解决方案,但是否有 API 或库正在成为构建动态 LINQ 查询的标准,例如所以我可以轻松地采用 DSL 语法并将其转换为 LINQ,例如“名字以 'a' 和 (state='co' 或 state='ca') 开头”?

using System;
using System.Collections.Generic;
using System.Linq;

namespace TestDynamicLinq2343
{
    public class Program
    {
        static void Main(string[] args)
        {
            List<Customer> customers = Customer.GetCustomers();

            List<Func<Customer, bool>> whereClauses = new List<Func<Customer, bool>>();
            whereClauses.Add(c => c.LastName.ToUpper().Contains("A"));
            whereClauses.Add(c => c.FirstName.ToUpper().Contains("O"));
            whereClauses.Add(c => c.FirstName.ToUpper().Contains("E"));

            foreach (var customer in Customer.GetFilteredCustomers(customers, whereClauses))
            {
                Console.WriteLine(customer.LastName);
            }

            Console.ReadLine();
        }
    }

    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Street { get; set; }
        public string Location { get; set; }
        public string ZipCode { get; set; }

        public static List<Customer> GetCustomers()
        {
            List<Customer> customers = new List<Customer>();
            customers.Add(new Customer { FirstName = "Jim", LastName = "Jones" });
            customers.Add(new Customer { FirstName = "Joe", LastName = "Adams" });
            customers.Add(new Customer { FirstName = "Jake", LastName = "Johnson" });
            customers.Add(new Customer { FirstName = "Angie", LastName = "Reckar" });
            customers.Add(new Customer { FirstName = "Jean", LastName = "Anderson" });
            return customers;
        }

        public static List<Customer> GetFilteredCustomers(List<Customer> customers, List<Func<Customer, bool>> whereClauses)
        {
            IEnumerable<Customer> dbCustomers = customers;
            foreach (var whereClause in whereClauses)
            {
                dbCustomers = dbCustomers.Where(whereClause);
            }
            return dbCustomers.ToList();
        }
    }
}

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    我当然可以支持PredicateBuilder 的建议作为一个有用的工具,并且是解决OR 问题的最佳方法。还有我偶尔使用的Microsoft Dynamic LINQ library,它可能适用于您从配置文件中传递子句的建议。

    在大多数情况下,当我需要一些动态查询元素时,我通常会像您在上面所做的那样直接针对特定问题进行编码。我在实时系统中有几个相当复杂的函数,它们从基本的根查询开始,然后根据传递给函数的参数添加一些额外的 Where 和 OrderBy 子句。

    虽然大多数 LINQ 示例似乎显示了相对简单的查询,但 LINQ 库非常强大,允许您逐步构建查询,然后仅在执行时生成实际查询,因此我倾向于倾向于只使用链式运算符而不是查询理解语法。

    【讨论】:

      【解决方案2】:

      动态查询构建在某种程度上是一项乏味的任务。请拜访 PredicateBuilder。您可以深入了解如何构建动态查询。

      【讨论】:

        猜你喜欢
        • 2010-10-18
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        • 2022-08-23
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        相关资源
        最近更新 更多