我有一个MVC5项目。在我的页面上,我有4个复选框和一个搜索按钮。单击该按钮时,将触发ajax调用以调用以下函数:
[HttpPost]
public ActionResult GetOpenOrders(ProductionStatus pStatus)
{
List<vw_orders> orderList = new List<vw_orders>();
OrderRepository orderRepo = new OrderRepository();
// Get the total list of open orders
orderList = orderRepo.getAllByStatus("V");
// If not all values are 0, we have to filter
// (allZero is a private function that checks if all property values of pStatus are 0)
if(allZero(productieStatus) != true)
{
// Only use the properties of pStatus where
// the value is 1
// example: pStatus.A = 1, pStatus.B = 0, pStatus.C = 1
orderList = orderList.Where( p => if(pStatus.A == 1) p.a == pStatus.A || if(pStatus.B == 1) p.b == pStatus.B || if(pStatus.C == 1) p.c = pStatus.C);
}
// return some json of orderList.ToList()
}
如何有条件地将OR条件添加到我的WHERE子句中,因此仅当值为。时 pStatus.property == 1?
答案 0 :(得分:1)
替换
orderList = orderList.Where(p => if(pStatus.A == 1) p.a == pStatus.A || if(pStatus.B == 1) p.b == pStatus.B || if(pStatus.C == 1) p.c = pStatus.C)
与
orderList = orderList.Where(p => (pStatus.A == 1 && p.a == pStatus.A ) || (pStatus.B == 1 && p.b == pStatus.B) || (pStatus.C == 1 && p.c = pStatus.C))
因此仅当pStatus.property的值== 1
时
所以p.a == pStatus.A
pStatus.A == 1
必须为true才能使此行成为结果的一部分。
答案 1 :(得分:0)
如果我正确理解了您的问题,您想要检查属性的值,如果在pStatus对象中设置了相应的属性。
这很简单,如果pStatus.A == 1
则p.A == pStatus.A
必须为真。这个陈述的问题是我们必须检查第一部分pStatus.A == 1
,然后确定是否需要检查第二部分p.A == pStatus.A
;其中,我们希望避免在我们的linq语句中进行过多的条件检查,因为事情很快就会变得混乱。所以,让我们尝试减少你真正要检查的内容。
显示此声明的简单方法是X=>Z
(如果X则是Z),其中X = pStatus.A == 1
且Z = p.A == pStatus.A
。 X=>Z
在逻辑上等同于¬X v Z
(不是X或Z),因为如果X
不正确,我们不关心Z
是什么以及Z
是的,那么我们不关心X
是否属实。在您的情况下,如果pStatus.A != 1
那么p.A
等于什么并不重要,如果p.A == pStatus.A
那么pStatus.A == 1
是否无关紧要因为检查将通过。
现在,如果我们在您的支票中替换X
和Z
,我们会(!(pStatus.A == 1) || p.A == pStatus.A)
我们可以移动不在括号内并获取(pStatus.A != 1 || p.A == pStatus.A)
。
如果我们用这个等效语句替换我们得到的支票:
orderList = orderList.Where( p => (pStatus.A != 1 || p.A == pStatus.A) && (pStatus.B != 1 || p.B == pStatus.B) && (pStatus.C != 1 || p.C == pStatus.C);
我们使用&amp;&amp;组之间因为我们希望每个检查都必须通过