关于过滤集合的LINQ查询的建议

时间:2015-10-28 09:29:51

标签: c# linq

我的List<T> Customers包含以下信息:名称,产品,便笺,预订日期和UnreadMessage。

我的目标是使用这些字段过滤客户并使用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 = Customers.Where(x =&gt; x.product.Contains(“someone”)&amp;&amp; x.bookingdate = DateTime.Now);

我希望您注意到我将为此类过滤编写多少个不同的查询。

仅限姓名,产品,备注,预订日期或未读消息

  • 名称和产品
  • 姓名和备注
  • 姓名和预订日期
  • 姓名和未读消息
  • 产品和说明
  • 产品和预订日期
  • 等等等

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

我正在寻求建议,并帮助解决这种过滤问题。

2 个答案:

答案 0 :(得分:3)

为什么不合并 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

答案 1 :(得分:2)

您可以动态构建语句。如果这是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();
    }

}