[英]What is the best approach to build dynamic LINQ queries?
感謝那些回答了我最后幾個問題的人,我使以下代碼可以正常工作 ,它使您可以將Where子句的集合發送到方法,這些子句都附加到LINQ查詢中。 這將適用於我需要的手頭案例。
但是,最好的擴展方法是:
基本上,這樣做的背景是能夠從此形式以解析的配置文件或用戶輸入動態構建LINQ查詢。
該任務使我想起了構建可以根據參數動態生成SQL語句的類,但是涉及到構建一個字符串 (SQL語句),該字符串比動態構建LINQ查詢更直接。
關於此主題有很多Stackoverflow問題和博客文章 ,但是它們似乎都是針對單個問題的單獨解決方案,但是是否有API或庫正在逐漸成為構建動態LINQ查詢的標准,例如, 因此我可以輕松地采用DSL語法並將其轉換為LINQ,例如“ FirstName以'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();
}
}
}
動態查詢構建是一個繁瑣的任務。 請訪問PredicateBuilder 。 您可以了解如何構建動態查詢。
我當然可以將PredicateBuilder的建議作為有用的工具,這是解決OR問題的最佳方法。 還有我偶爾使用的Microsoft Dynamic LINQ庫 ,它可能與您建議從配置文件傳遞子句一起使用。
在大多數情況下,當我需要動態查詢的某些元素時,我通常會像上面所做的那樣直接結束對特定問題的編碼。 我在實時系統中有幾個非常復雜的功能,這些功能從基本的根查詢開始,然后根據傳遞給函數的參數添加一些額外的Where
和OrderBy
子句。
盡管大多數LINQ示例似乎都顯示了相對簡單的查詢,但是LINQ庫功能非常強大,可讓您逐步建立查詢,然后僅在執行查詢時才生成實際查詢,因此我傾向於只使用鏈式運算符,而不是查詢理解語法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.