如何在LINQ中执行可选参数?

时间:2011-07-20 23:57:09

标签: c# linq

这是我正在尝试做的事情:

(Dc.DET_Cases.Where(c => c.ProductID == pl.ProductID 
                    && oldTOR == false ? c.OldTOR == oldTOR : 
                    && (productLineName.ToInt() == 0 || productLineName.ToInt() == c.ProductLineID)
                    && (productCategory.ToInt() == 0 || productCategory.ToInt() == c.ProductCategoryID)
                    && (issueType.ToInt() == 0 || issueType.ToInt() == c.IssueTypeID)
                    && (issue.ToInt() == 0 || issue.ToInt() == c.IssueID)
                    )
                    .FirstOrDefault() != null)

这是我要做的路线。

oldTOR == false ? c.OldTOR == oldTOR :

where LINQ语句中。如果值为false,则比较该值。如果没有,那就忽略它。

3 个答案:

答案 0 :(得分:5)

最简单的方法是将另一个选项设置为true

即:!oldTOR ? c.OldTOR == oldTOR : true

这意味着如果oldTor为false,那么我们要比较OldTor,否则,继续评估表达式的其余部分。

顺便说一下,我会将您的大量.Where()布尔比较的每个部分拆分为单独的.Where()语句。这将提高您的Linq的可读性和理解力。

    Dc.DET_Cases
        .Where(c => c.ProductID == pl.ProductID)
        .Where(c => !oldTOR ? c.OldTOR == oldTOR :  true)
        .Where(c => productLineName.ToInt() == 0 || productLineName.ToInt() == c.ProductLineID)
        .Where(c => productCategory.ToInt() == 0 || productCategory.ToInt() == c.ProductCategoryID)
        .Where(c => issueType.ToInt() == 0 || issueType.ToInt() == c.IssueTypeID)
        .Where(c => issue.ToInt() == 0 || issue.ToInt() == c.IssueID)
        .FirstOrDefault() != null;

这清楚表明,如果oldTorfalse,那么您要比较,否则,传递该语句(true)。

答案 1 :(得分:0)

我认为你可以使用LINQ Dynamic Query Library

然后根据需要创建一个查询。

答案 2 :(得分:0)

最快的方法是通过评估路径:

oldTOR && (c.OldTor == oldTOR)

为什么这是最快的?答:如果oldTOR为false,则整个 语句为false,并且无需比较语句的其余部分。