有条件的Linq

时间:2014-10-01 07:30:00

标签: c# linq

我有两个条件,它们既可以设置也可以只设置其中一个。如果两者都设置为一个值linq where语句将被触发,并且AND作为布尔运算符,则linq where语句应仅包含基于设置条件的过滤器。

例如:

两个条件设置:linq.Where(condition1&& condition2)...

只有condition1设置:linq.Where(condition1)..

只有条件2设置:linq.Where(condition2)..

这是不允许的:linq.Where(condition1 || condition2)因为过滤应该非常准确

现在我的问题是如何编写一个考虑所有这些要求的linq语句?提前致谢

编辑:

谓词可能如下所示:x => x> 10或x => x =="你好"或x => x + 2 == 3 ..任何适合where语句的表达式。

我得到条件/谓词,我不自己创建

对于谓词,我指的是数学中的那些谓词,而不是c#中的类。

由于我不知道如何在一个linq语句中执行此操作,因此没有太多要发布的代码

结果必须是处理所有这一切的一个linq语句。

我是新手我不知道如何写这个为什么我希望你能帮助我。

如果你不喜欢它,请不要忘记它只是传递,有人会帮助我。

EDIT2:

我是说这个。不多也不少:

method<T> filterList(ienumerable<T> linq, Predicate<T> p1, Predicate<T> p2)
{
  return linq.Where(only p1 or only p2 or p1 && p2)
}

3 个答案:

答案 0 :(得分:4)

这是monad的美丽 - 你不必一步到位。

// bool? flag1
// bool? flag2
// IQueryable<something> collection


if(flag1.HasValue)
    collection = collection.Where(x => x.Flag1 == flag1);

if(flag2.HasValue)
    collection = collection.Where(x => x.Flag2 == flag2);

//...

编辑:如果你想在一个LINQ语句中完成它,你需要通过调用谓词来做一些技巧:

public IEnumerable<T> FilterList<T>(IEnumerable<T> collection, Predicate<T> p1, Predicate<T> p2)
{
    return collection.Where(x =>
        (p1 == null || p1.Invoke(x)) &&
        (p2 == null || p2.Invoke(x))
    );
}

答案 1 :(得分:1)

如果两者都未设置,你不会说该怎么办,我假设在这种情况下根本没有过滤 我假设没有价值&#39;你的意思是例如p1是null。 我不能100%确定 ONE linq声明的含义,但我认为至少有一个符合您的需求。

在所有情况下我基本上都说[用始终为真的谓词和谓词替换空谓词]

解决方案1 ​​

return linq.Where(x => p1 != null ? p1(x) : true).Where(x => p2 != null ? p2(x) : true);

解决方案2

var p1a = p1 ?? (x => true);
var p2a = p2 ?? (x => true);
return linq.Where(x => p1a(x) && p2a(x));

解决方案3

return linq.Where(x => (p1 ?? (y=>true))(x) && (p2 ?? (z=>true))(x));

答案 2 :(得分:0)

如果您使用第三方PredicateBuilder,则可以迭代构建or过滤器以及and

例如

  var predicate = PredicateBuilder.False<Product>();

  foreach (string keyword in keywords)
  {
    string temp = keyword;
    predicate = predicate.Or (p => p.Description.Contains (temp));
  }
  return dataContext.Products.Where (predicate);