代码之家  ›  专栏  ›  技术社区  ›  Greg B

删除LINQ查询中的WHERE子句

  •  2
  • Greg B  · 技术社区  · 15 年前

    我有一个包含许多位列的产品信息表。可以从每个列都有复选框的界面查询此表。复选框分为几个相关组。

    例如,其中三列描述了产品在汽车、航空和海运等各个市场的适用性。

    如果没有选中这些复选框,我希望执行以下SQL。

    SELECT * FROM Products
    

    如果检查了Automotive,则应执行以下SQL

    SELECT * FROM Products WHERE Automotive = 1
    

    如果有多个选项被选中,我希望这些选项在一起

    SELECT * FROM Products WHERE 
        Automotive = 1 
        OR 
        Aviation = 1
    

    在旧的C&SQL中,我可以通过有条件地将SQL连接在一起来实现这种逻辑,但在用LINQ生成相同的逻辑时遇到了困难。

    我的问题是如何有条件地将WHERE子句及其元素添加到我的查询中。

    我希望只有一个执行查询的点,因此,如果可能的话,我希望避免使用C# 如果 将分支到不同的查询中。

    3 回复  |  直到 15 年前
        1
  •  6
  •   tvanfosson    15 年前

    我会用 PredicateBuilder 为此。

    var query = db.GetTable<Products>().AsQueryable();
    
    var predicate = PredicateBuilder.False<Products>();
    if (automotive.Checked)
    {
        predicate = predicate.Or( p => p.Automotive == 1 );
    }
    if (aviation.Checked) 
    {
        predicate = predicate.Or( p => p.Aviation == 1 );
    }
    query = query.Where( predicate );
    
        2
  •  3
  •   JaredPar    15 年前

    将值设为“或”与“和”会使这个问题更加困难。如果是“和”,那么下面的内容就可以了

    public IEnumerable<Products> GetQuery() {
      var query = db.GetTable<Products>();
      if ( automotiveBox.Checked ) {
        query = query.Where(x => x.Automotive == 1);
      }
      if ( aviation.Checked ) {
        query = query.Where(x => x.Aviation == 1);
      }
      return query
    }
    

    因为它是一个“或”,尽管我认为您唯一的选择是手工构建表达式树,并将其用作WHERE子句。

        3
  •  3
  •   Reed Copsey    15 年前

    如果您试图将“或”语句组合在一起以检查单个列,则可以使用 Contains 为了完成这一点。这里有一个 good blog post 显示这是如何工作的。

    但是,如果您试图动态地检查不同的列,这将不起作用。在这种情况下,可能需要多个语句。