代码之家  ›  专栏  ›  技术社区  ›  techV

避免使用带有多个where子句的Lambda表达式

  •  -3
  • techV  · 技术社区  · 9 年前

    我们如何在单个lambda表达式中定义多个where子句。我需要的是,若lambda表达式找到符合条件的结果,那个么它只过滤掉那个些记录,否则它将返回所有记录。我想在一个lambda表达式中得到它。因为我有多个条件,必须使用lambda表达式从数据库中筛选记录。

    我不想使用if-else条件,然后相应地更改lambda表达式。我想用一个表达式实现这一点。

    var objList = from o in db.sometable
                                  join p in db.sometable1 on o.sometable1Id equals p.Id
                                  join q in db.sometable2 on p.Id equals q.Id
                                  join r in db.sometable3 on p.Id equals r.Id
                                  join s in db.sometable4 on o.id equals s.Id
                                  where r.1stcriteria == X || r.2ndCriteria == Y || r.3rdCriteria == Z
                                  select new
                                  {
                                      o.Id,
                                      r.X,
                                      r.Y,
                                      s.Name,
                                      o.area_sold,
                                      p.stock
    
                                  };
    

    在上面的表达式中,我需要得到结果,即使没有条件匹配或其中任何一个条件匹配。甚至其中两个匹配。

    2 回复  |  直到 9 年前
        1
  •  2
  •   Hano Johannes Rossouw    4 年前

    在您的lambda表达式中,运算符逻辑仍在发挥作用,如果我理解您的需求,将为您提供所需的内容,例如,我们采用

    .Where(a=> a.ID == someId);
    

    假设这是我们的一个标准,现在为了增加第二个,您可以使用&&以及||

    .Where(a=> (a.ID == someId) && ((a.ID < 50) && (a.ID > 5)));
    

    不过,如果您想正确分组布尔检查,括号很重要。

        2
  •  1
  •   Jonidas    9 年前

    我不完全理解,你可以在where:list上使用多重标准。其中(x=>(条件1)||(条件2))。要获得整个列表,只需在以下情况下添加一个:

    var filteredList = myList.where(x=> (conditions1(x)) || (condition2(x))).toList();
    
    if (filteredList.count == 0)
        filteredList = myList;