【问题标题】:Conditional Where clause in Linq query for specific cases针对特定情况的 Linq 查询中的条件 Where 子句
【发布时间】:2018-11-28 18:18:13
【问题描述】:

我有一个实体框架查询,它根据特定条件从数据库中检索结果。但是,有一个实例,我想根据 where 子句中的条件过滤结果。我认为案例陈述是我将如何实现这一点,有人能指出我正确的方向吗?

因此,对于从 OutageList 返回的结果,对于中断类型为“实时”的情况,我只希望在 NumberOfPeopleAffected 大于 4 时将其包含在结果中。例如:

 outageList.Where(o => o.FaultType == "Live" && o.NumberOfPeopleAffected > 4)

问题是,上面的代码还不够,因为我也想返回其他中断,只是对于 Live 中断的情况,我只想在受影响的人数超过 4 时返回它们。

这有意义吗?这是我需要的案例陈述吗?如果是这样,在 LINQ 中编写此代码的最佳方法是什么?

【问题讨论】:

    标签: c# list entity-framework linq


    【解决方案1】:

    因为在您构建查询时,类型是 IQueryable,并且因为它实际上不会访问数据库(或其他)并“实现”结果,直到您 .Select.ToList(),您可能会考虑链接您的在 switch / if 子句中过滤。这将有效地为您的查询添加一堆或“where”子句,直到您实际执行它。

    例如:

    if(case1)
    outageList = outageList.Where(o => o.FaultType == "Live" && o.NumberOfPeopleAffected > 4)
    
    if(case2)
    outageList = outageList.Where(o => o.FaultType == "Unplanned" && o.NumberOfPeopleAffected > 0)
    
    return outageList.Select(i => new myViewModel{
        prop1 = i.prop1,
        prop2 = i.prop2 // etc
    })
    

    【讨论】:

    • 问题是OP同时想要case1和case 2。如果你有 case1 和 case2 都是真的,你根本不会得到任何结果!
    【解决方案2】:

    使用这个查询:

     outageList.Where(o => (o.FaultType == "Live" && o.NumberOfPeopleAffected > 4) || o.FaultType != "Live")
    

    【讨论】:

      【解决方案3】:

      要在 linq 中做你想做的事,请使用下面。

      var faultList = new[] {"Live", "SomethingElse"};
      
      outageList.Where(o => faultList.Contains(o.FaultType) && o.NumberOfPeopleAffected > (o.FaultType == "Live" ? 4 : 0));
      

      说实话,我可以使用此语句,但我意识到它可能难以阅读。

      【讨论】:

      • 回想起来,我认为它缺少一些东西,我可能有点太快了...
      • 好的修复它。 @nicholas-reynolds 答案也有效,我的答案是“包容性”,这意味着您需要指定要返回的故障列表,他将返回所有内容,并且仅在受影响的人小于 4 时过滤掉 FaultType == “Live”
      【解决方案4】:

      您可以在 Where() 子句中包含 OR 条件:

      outageList.Where(o => (o.FaultType == "Live" && o.NumberOfPeopleAffected > 4) || o.FaultType != "Live");
      

      【讨论】:

      • 我认为这是最好的答案。它说“给我所有没有有faulttype = live,或所有 faulttype = live AND NumberOfPeopleAffected > 4”。辉煌
      • 你可以稍微简化一下 - 你不需要 o.FaultType == "Live" 部分,因为在 o.FaultType != "Live" 之后,唯一剩下的就是活的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2020-12-31
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多