【问题标题】:Advice regarding LINQ query for filtering collections关于过滤集合的 LINQ 查询的建议
【发布时间】:2015-10-28 09:29:51
【问题描述】:

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

我的目标是使用这些字段并使用 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 => x.product.Contains("someone") && x.bookingdate=DateTime.Now);

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

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

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

顺便说一句,我正在编写一个 Windows 平板电脑应用程序,因此无法使用 DataTable 和 LINQ Dyanmics,而我只能编写一个字符串表达式。

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

【问题讨论】:

    标签: c# linq


    【解决方案1】:

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

    【讨论】:

      【解决方案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();
          }
      
      }
      

      【讨论】:

      • 在您的屏幕截图中,您选择了ToList。请注意,我没有这样做。我只是先构建语句并执行一次。寻找延迟执行。
      • 是的,我的没有优化,因为我必须将其转换为每个查询的列表。
      猜你喜欢
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 2011-10-05
      • 1970-01-01
      • 2018-07-22
      相关资源
      最近更新 更多