C# 构建动态LINQ查询的最佳方法是什么?

C# 构建动态LINQ查询的最佳方法是什么?,c#,linq,C#,Linq,感谢那些回答了我最后几个问题的人,我得到了下面的代码,它允许您将Where子句的集合发送到一个方法,该方法都附加到LINQ查询。这将对我需要的手头的案子起作用 但是,扩展此功能的最佳方法是什么,以便: 可以发送OrderBy子句 Where子句可以与或“logic组合,而不仅仅与“and”逻辑组合 可以动态发送其他选项,例如,发送回的对象中包含哪些字段(例如,在下面的示例中,不必总是客户) 基本上,其背景是能够从这个表单、解析的配置文件或用户输入动态构建LINQ查询 这个任务让我想起了构建类

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

但是,扩展此功能的最佳方法是什么,以便:

  • 可以发送OrderBy子句
  • Where子句可以与或“logic组合,而不仅仅与“and”逻辑组合
  • 可以动态发送其他选项,例如,发送回的对象中包含哪些字段(例如,在下面的示例中,不必总是客户)
基本上,其背景是能够从这个表单、解析的配置文件或用户输入动态构建LINQ查询

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

关于这个主题有很多Stackoverflow问题,但它们似乎都是针对单个问题的单独解决方案,但是是否有一个API或库正在成为构建动态LINQ查询的标准,例如,这样我就可以轻松地采用DSL语法并将其翻译成LINQ,例如“FirstName startswith'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();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
命名空间TestDynamicLinq2343
{
公共课程
{
静态void Main(字符串[]参数)
{
List customers=Customer.GetCustomers();
List whereClaires=新列表();
whereClaires.Add(c=>c.LastName.ToUpper().Contains(“A”));
where子句.Add(c=>c.FirstName.ToUpper().Contains(“O”));
where子句.Add(c=>c.FirstName.ToUpper().Contains(“E”));
foreach(customer.GetFilteredCustomers(customers,where子句)中的var customer)
{
Console.WriteLine(customer.LastName);
}
Console.ReadLine();
}
}
公共类客户
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串Street{get;set;}
公共字符串位置{get;set;}
公共字符串ZipCode{get;set;}
公共静态列表GetCustomers()
{
列出客户=新列表();
添加(新客户{FirstName=“Jim”,LastName=“Jones”});
添加(新客户{FirstName=“Joe”,LastName=“Adams”});
添加(新客户{FirstName=“Jake”,LastName=“Johnson”});
添加(新客户{FirstName=“Angie”,LastName=“Reckar”});
添加(新客户{FirstName=“Jean”,LastName=“Anderson”});
返回客户;
}
公共静态列表GetFilteredCustomers(列出客户,列出Where子句)
{
IEnumerable dbCustomers=客户;
foreach(var WhereClaires in WhereClaires)
{
dbCustomers=dbCustomers.Where(Where条款);
}
返回dbCustomers.ToList();
}
}
}

动态查询构建不知何故是一项乏味的任务。请访问
。您可以了解动态需求是如何构建的。

我当然可以支持的建议,认为它是一个有用的工具,是解决问题的最佳方法。还有我偶尔使用的,可能与您建议的从配置文件传递子句一起使用

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

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