【问题标题】:How to do optional parameters in LINQ?如何在 LINQ 中做可选参数?
【发布时间】:2015-07-13 21:53:44
【问题描述】:

这是我想要做的:

(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,则比较该值。如果没有,请忽略它。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

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

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

    这意味着如果oldTor 为假,那么我们要比较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)。

    【讨论】:

    • 最简单的是 (oldTor || c.OldTOR == oldTOR) - 不需要 ?完全由于 || 的短路。
    【解决方案2】:

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

    然后根据需要创建查询。

    【讨论】:

      【解决方案3】:

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

      oldTOR && (c.OldTor == oldTOR)
      

      为什么这是最快的?答:如果oldTOR为假,那么整个and语句都是假的,不需要比较语句的其余部分。

      【讨论】:

      • OP 声明如果值为 false 则进行比较。那就是使用||不是 &&。
      猜你喜欢
      • 2012-04-19
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 2018-05-07
      • 2018-12-10
      • 1970-01-01
      • 2021-11-29
      相关资源
      最近更新 更多