【发布时间】: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();
}
}
}
【问题讨论】: