LINQ 查询条件外部参数

Posted

技术标签:

【中文标题】LINQ 查询条件外部参数【英文标题】:LINQ Query if condition external parameter 【发布时间】: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。当然,如果您将其简化,它将变得像给出的答案一样。 【参考方案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();

这意味着如果boolparameterfalse,x.Score 无关紧要,因为!false 等于true 并且它满足OR 条件。同样,如果boolparametertrue,那么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 是否为真。

【讨论】:

以上是关于LINQ 查询条件外部参数的主要内容,如果未能解决你的问题,请参考以下文章

Linq:如果参数为空,如何排除条件

Linq查询条件怎么查询呢

LINQ里如何设置查询条件的日期为昨天或者当天????

多条件搜索问题 -sql拼接与参数化查询

C# Linq group by 和 group by into 运用实例

在 linq 查询中按条件过滤