我有一个实体框架查询,该查询正在基于特定条件从数据库检索结果。但是,有一个实例,我想根据where子句中的条件过滤结果。我认为案例说明是我将如何实现这一目标的人,有人能指出我正确的方向吗?
因此,对于从中断列表返回的结果,对于中断类型为“实时”的情况,我只希望在NumberOfPeopleAffected大于4的情况下将其包括在结果中。例如:
outageList.Where(o => o.FaultType == "Live" && o.NumberOfPeopleAffected > 4)
问题是,上面的代码不够用,因为我也想返回其他中断,就现场中断而言,我只想在受影响的人数大于4时返回它们。
这有意义吗?我需要案件陈述吗?如果是这样,用LINQ编写此内容的最佳方法是什么?
答案 0 :(得分:2)
您的Where()
子句中可以包含OR条件:
outageList.Where(o => (o.FaultType == "Live" && o.NumberOfPeopleAffected > 4) || o.FaultType != "Live");
答案 1 :(得分:0)
要在linq中执行所需操作,请在下面使用。
var faultList = new[] {"Live", "SomethingElse"};
outageList.Where(o => faultList.Contains(o.FaultType) && o.NumberOfPeopleAffected > (o.FaultType == "Live" ? 4 : 0));
说实话,我可以使用此语句,但是我意识到它可能很难阅读。
答案 2 :(得分:0)
使用此查询:
outageList.Where(o => (o.FaultType == "Live" && o.NumberOfPeopleAffected > 4) || o.FaultType != "Live")
答案 3 :(得分:0)
由于建立查询时,该类型是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
})