我有两个条件,它们既可以设置也可以只设置其中一个。如果两者都设置为一个值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)
}
答案 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);