簡體   English   中英

如何在LINQ語句中處理多個where子句?

[英]How to process multiple where clauses in a LINQ statement?

感謝那些回答我上一個問題的人,我得到了下面的代碼,它允許開發人員將多個where子句發送到一個方法,該方法在LINQ語句中包含每個子句。 但是,如何才能將where子句包含在動態中呢? 而不是這個:

return customers
       .Where(whereClauses[0])
       .Where(whereClauses[1])
       .ToList();

像這樣的東西(偽代碼):

List<Customer> customers = new List<Customer>();
foreach (var whereClause in whereClauses)
{
    customers
    .Where(whereClause...???)
    .ToList();
}
return customers;

這是有效的代碼:

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("J"));

            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)
        {
            return customers
                   .Where(whereClauses[0])
                   .Where(whereClauses[1])
                   .ToList();
        }
    }
}
IEnumerable<Customer> dbCustomers = customers;
foreach (var whereClause in whereClauses)
{
    dbCustomers = dbCustomers.Where(whereClause);
}
return dbCustomers.ToList();

也許有趣的extensionMethod:

public static class IEnumerableExtension
{
    public static void AttachWhereClauses<T>(this IEnumerable<T> source, IEnumerable<Func<T, bool>> whereClauses)
    {
        foreach (var whereClause in whereClauses)
        {
            source = source.Where(whereClause);
        }
    }
}
var listedCustomers = customers.AttachWhereClauses(whereClauses).ToList();

但是:未經測試 - 我不確定,如果將whereClauses附加到同一個對象上工作!

像這樣的東西:

public IEnumerable<Customer> ApplyConditions(IEnumerable<Func<Customer, bool>> conditions)
{
    IEnumerable<Customer> customers = ...;
    foreach(var condition in conditions)
        customers = customers.Where(condition);
    return customers;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM