我正在尝试创建一个类,该类允许我在完成类后且测试结果与预期不符时使用.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/

10-10 10:47