如果ID=0,忽略.where lambda查询

本文关键字:where lambda 查询 忽略 ID 如果 | 更新日期: 2023-09-27 18:16:28

我有两个重载的方法,因为参数SecondVar有时可用,有时不可:-

private void DoSomething(int FirstVar)
{
    int SecondVar = 0;
    DoSomething(FirstVar, SecondVar);
}
private void DoSomething(int FirstVar, int SecondVar)
{
    DoSomething(FirstVar, SecondVar);
    if(SecondVar > 0)
    {
       var a = GetList().Where(x=>x.FirstId == FirstVar && x.SecondId == SecondVar);
    }
    else
    {
       var a = GetList().Where(x=>x.FirstId == FirstVar);
    }
}

是否有可能在第二个重载DoSomething中摆脱If子句?

感谢您的帮助和时间

如果ID=0,忽略.where lambda查询

private void DoSomething(int FirstVar, int SecondVar)
{
    // DoSomething(FirstVar, SecondVar);
    var a = GetList().Where(x=>x.FirstId == FirstVar && (SecondVar == 0 || x.SecondId == SecondVar));    
}

谢谢你的编辑-你是对的- op清楚地说"当第二个变量为0时,忽略"。所以,添加一个可选的空参数实在是太离谱了。

现在这里有一个无限循环

private void DoSomething(int FirstVar, int SecondVar)
{
    DoSomething(FirstVar, SecondVar);

除此之外,您可以使用Nullable<int>作为参数,然后您不需要重载:

private void DoSomething(int firstVar, int? secondVar = null)
{
    var a = GetList().Where(x=> x.FirstId == firstVar &&
      (!secondVar.HasValue ||  x.SecondId == secondVar.Value));
    // ...
}

它与你的"if"-语句相同,但写得不同(所以可能不是你想要的,但是…):

var a = SecondVar > 0
                        ? GetList().Where(x => x.FirstId == FirstVar && x.SecondId == SecondVar)
                        : GetList().Where(x => x.FirstId == FirstVar);

像这样?

var a = GetList().Where(x => (SecondVar > 0 && x.FirstId == FirstVar && x.SecondId == SecondVar) || (SecondVar <= 0 && x.FirstId == FirstVar));

Where子句中使用Nullable SecondVarCoalescing operator。在这种情况下,如果您不传递SecondVar,它将为空,并且查询将不会被SecondVar过滤。

private void DoSomething(int FirstVar, int? SecondVar = null)
{
  var a = GetList()
          .Where(x=> x.FirstId == FirstVar && 
                     x.SecondId == (SecondVar?? x.SecondId));
}

如果你需要通过SecondVar进行过滤,如果它只是正的,那么;

private void DoSomething(int FirstVar, int SecondVar)
{
  var a = GetList()
          .Where(x=> x.FirstId == FirstVar && 
                     x.SecondId == (SecondVar > 0? SecondVar: x.SecondId));
}