【问题标题】:LINQ Query if condition external parameterLINQ 查询条件外部参数
【发布时间】:2020-05-07 10:45:06
【问题描述】:

我正在尝试使用 LINQ 获取值列表。

我有这样的代码:

var _context = _scope.ServiceProvider.GetRequiredService<VMContext>();

if (boolparameter)
{
    var listCE = _context.Ce
                         .Where(x => x.VuId == element.VuId)
                         .Where(x => x.Score == 8)
                         .AsNoTracking()
                         .ToList();
}
else
{
    var listCE = _context.Ce
                         .Where(x => x.VuId == element.VuId)
                         .AsNoTracking()
                         .ToList();
}

取决于布尔参数,我做一个查询或另一个。有没有办法使用带有条件的单个查询? 比如:

var listCE = _context.Ce
                     .Where(x => x.VuId == element.VuId)
                     .Where(x => boolparameter ? x.Score == 8 : true)
                     .AsNoTracking()
                     .ToList();

C# Asp.NetCore SqlServer 2019 非常感谢!

【问题讨论】:

  • 其他答案很好,但可能有点难以理解。我发现这更容易理解。 (boolparameter &amp;&amp; x.Score==8) || !boolparameter。当然,如果您将其简化,它将变得像给出的答案一样。

标签: c# sql-server linq tsql asp.net-core


【解决方案1】:

这种方式比较冗长,但是如果您有更多(或复杂)的条件,则可以更容易阅读并快速了解影响查询的因素。 在您到达.ToList() 或尝试访问查询结果之前,LINQ 不会执行查询。

这意味着您不需要在 if 和 else 部分中复制完整的查询:

var _context = _scope.ServiceProvider.GetRequiredService<VMContext>();

var listCEQuery = _context.Ce.Where(x => x.VuId == element.VuId)

// LINQ will append this to the initial where clause   
if (boolparameter == true)
    listCEQuery = listCEQuery.Where(x => x.Score == 8)

var listCE = listCEQuery.AsNoTracking().ToList();

【讨论】:

    【解决方案2】:

    你能在下面检查一下吗?

    var listCE = _context.Ce
            .Where(x => boolparameter == false ? x.VuId == element.VuId : 
            (x.VuId == element.VuId && 
            x.Score == 8)) 
            .AsNoTracking()
            .ToList();     
    

    【讨论】:

      【解决方案3】:

      如果可以的话,你可以试试下面的代码:

      var listCE = _context.Ce
        .Where(x => x.VuId == element.VuId)
        .Where(x => !boolparameter || x.Score == 8)
        .AsNoTracking()
        .ToList();
      

      这意味着如果boolparameter 是false,x.Score 无关紧要,因为!false 等于true 并且它满足OR 条件。同样,如果boolparameter 是true,那么x.score 是否等于8 也会被检查。

      或者可能有一个 Where 条件:

      var listCE = _context.Ce
        .Where(x => x.VuId == element.VuId && (!boolparameter || x.Score == 8))
        .AsNoTracking()
        .ToList();
      

      【讨论】:

        【解决方案4】:
        var listCE = _context.Ce
            .Where(x =>
                x.VuId == element.VuId
                && (!boolparameter || x.Score == 8))
            .AsNoTracking()
            .ToList();
        

        这会在检查x.Score 之前检查boolparameter 是否为真。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多