向LINQ查询添加条件OR子句

时间:2017-04-03 12:43:08

标签: c# linq

我有一个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?

2 个答案:

答案 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 == 1p.A == pStatus.A必须为真。这个陈述的问题是我们必须检查第一部分pStatus.A == 1,然后确定是否需要检查第二部分p.A == pStatus.A;其中,我们希望避免在我们的linq语句中进行过多的条件检查,因为事情很快就会变得混乱。所以,让我们尝试减少你真正要检查的内容。

显示此声明的简单方法是X=>Z(如果X则是Z),其中X = pStatus.A == 1且Z = p.A == pStatus.AX=>Z在逻辑上等同于¬X v Z(不是X或Z),因为如果X不正确,我们不关心Z是什么以及Z是的,那么我们不关心X是否属实。在您的情况下,如果pStatus.A != 1那么p.A等于什么并不重要,如果p.A == pStatus.A那么pStatus.A == 1是否无关紧要因为检查将通过。

现在,如果我们在您的支票中替换XZ,我们会(!(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;组之间因为我们希望每个检查都必须通过