有关筛选集合的LINQ查询的建议

本文关键字:查询 LINQ 筛选 集合 | 更新日期: 2023-09-27 18:19:39

我有一个CustomersList<T>,其中包含以下信息:名称、产品、备注、预订日期和未读消息。

我的目标是使用这些字段和and运算符来筛选客户,但让我感到困扰的是,当有一个字段不用于筛选时。

例如,助理将查找具有特定产品的客户名称。我可以有一个LINQ查询,它看起来像这样。

var a = Customers.Where(x => x.name.Contains("someone") && x.product.Contains("nike"));

另一个例子是,它将寻找一个客户,与特定的产品,与一些注意

var a = Customers.Where(x => x.name.Contains("someone") && x.product.Contains("nike") && x.note.Contains("some note"));

另一个例子是,它将查找产品和预订日期var a=客户。其中(x=>x.product.Contains("某人")&amp;x.bookingdate=DateTime.Now);

我希望你注意到我将为这种过滤写多少不同的查询。

仅的名称、产品、备注、预订日期或未读信息

  • 名称和产品
  • 姓名和备注
  • 姓名和预订日期
  • 姓名和未读邮件
  • 产品和注释
  • 产品和预订日期

顺便说一句,我正在写一个Windows平板电脑应用程序,所以DataTable和LINQ Dyanmics是不可能的,我只能写一个字符串表达式。

我正在寻求一个建议和帮助如何解决这种过滤。

有关筛选集合的LINQ查询的建议

为什么不合并Where

var result = Customers
  .Where(item => (null == name) || item.name.Contains(name))
  .Where(item => (null == product) || item.product.Contains(product))
  .Where(item => (null == note) || item.note.Contains(note))
  ...

因此,如果您不想通过任何参数(nameproduct等)进行筛选,只需将其设置为null即可。

您可以动态构建您的语句。如果这是linq to sql,您将从使用这种方法的更简单的执行计划中受益:

public class test
{
    public string name;
    public string lastname;
}
class Program
{
    static void Main(string[] args)
    {
        var list = new List<test>
        {
            new test{name = "john", lastname = "smith"}
        };
        string fname = "aa";
        string lname = "sm";

        var select = list.Select(c=>c);
        if (fname != null)
            select = select.Where(c => c.name.Contains(fname));
        if (lname != null)
            select = select.Where(c => c.lastname.Contains(lname));
        var result = select.ToList();
    }
}