我正在尝试创建一个类,该类允许我在完成类后且测试结果与预期不符时使用.Where()方法在运行时配置LINQ查询,因此出现问题并解决了我所需要的问题多次调用.Where()方法,它的行为应类似于OR ||不喜欢AND &&
例:
class Program
{
private static string WhereTest()
{
string result = "";
// List
string[] lst = { "Sa", "Su", "Mo", "Tu", "We", "Th", "Fr" };
// test 1
var q1 = from l in lst
where l.StartsWith("S") && l.EndsWith("u")
select l;
result = "1st query count: " + q1.Count()
+ "\n----------------- \nItems: \n------- \n";
foreach (var item in q1.ToList())
{
result += item + "\n";
}
result += "\n";
result += "\n";
// test 2
var q2 = from l in lst
where l.StartsWith("S") || l.EndsWith("u")
select l;
result += "2nd query count: " + q2.Count()
+ "\n----------------- \nItems: \n------- \n";
foreach (var item in q2.ToList())
{
result += item + "\n";
}
result += "\n";
result += "\n";
// test 3
var q3 = from l in lst
select l;
if (true)
q3 = q3.Where(l => l.StartsWith("S"));
if (true)
q3 = q3.Where(l => l.EndsWith("u"));
result += "3rd query count: " + q3.Count()
+ "\n----------------- \nItems: \n------- \n";
foreach (var item in q3.ToList())
{
result += item + "\n";
}
result += "\n";
result += "\n";
return result;
}
static void Main(string[] args)
{
Console.WriteLine(WhereTest());
}
}
结果:
第一个查询计数:1
-----------------
项目:
-------
苏
第二查询数:3
-----------------
项目:
-------
萨
苏
涂
第三查询数:1
-----------------
项目:
-------
苏
在我的示例q3中返回与q1相同的结果
因此,我需要知道是否可以使q3返回与q2相同的结果。
问候
最佳答案
对于LINQ to SQL或其他基于查询的提供程序,PredicateBuilder
是解决方案。它不允许您多次调用Where
,但可以使用多个调用动态创建谓词。
对于LINQ to Objects,您可以使用委托而不是表达式树as shown in this answer创建自己的PredicateBuilder
等效项。只是为了使这个答案本身完整,这里再次是相同的代码:
public static class DelegatePredicateBuilder
{
public static Func<T, bool> True<T>() { return f => true; }
public static Func<T, bool> False<T>() { return f => false; }
public static Func<T, bool> Or<T>(this Func<T, bool> expr1,
Func<T, bool> expr2)
{
return t => expr1(t) || expr2(t);
}
public static Func<T, bool> And<T>(this Func<T, bool> expr1,
Func<T, bool> expr2)
{
return t => expr1(t) && expr2(t);
}
}
因此,您将使用类似:
var predicate = DelegatePredicateBuilder.False<string>();
if (someCondition)
{
predicate = predicate.Or(l => l.StartsWith("S"));
}
if (someCondition)
{
predicate = predicate.Or(l => l.EndsWith("u"));
}
query = query.Where(predicate);
关于c# - 如何多次调用linq中的.Where()方法以使其表现为OR(||),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8634693/