LINQ Where语句与OR连接

时间:2014-12-06 20:18:39

标签: c# .net entity-framework linq

通常可以连接多个"其中" Queryable中的语句,结果通过在" Where"的表达式之间使用AND逻辑进行过滤。语句。

如何连接" Where"使用OR逻辑的语句? 类似的东西:

query.OrWhere(t => true).OrWhere(t => false)

我试图通过循环来有条件地创建查询。

for (var i = 0; i < 15; i++)
{
   switch(i)
   {
      case 0:
      { 
           if (something happens)
           {
                query = query.OrWhere(t => t.columnDependingOnIndex is something);
           }
           break;
      }
      //and so on ...
   }
}

3 个答案:

答案 0 :(得分:3)

在一个Where语句中使用或(||)

query.Where(somePredicate || someOtherPredicate)

另一种方法是使用.Union -

var q1 = query.Where(somePredicate)
var q2 = query.Where(someOtherPredicate)

var res = q1.Union(q2)

答案 1 :(得分:0)

您在寻找query.Where(t => true || false)吗?

一些示例代码:

        var someInts = new List<int>
        {
            1,2,3,4,5,6,6,7
        };

        someInts.Where(i => i == 5 || i == 6);

或者,您可以创建一个查询对象,其中包含解析列表的所有函数(这里是一些自包含的代码:

namespace LinqPlayground
{
    class Program
    {
        static void Main(string[] args)
        {
            var someInts = new List<int>
            {
                1,2,3,4,5,6,6,7
            };

            var queryObjectPattern = new QueryObjectPattern<int>();
            queryObjectPattern.AddOr(i => i == 5);
            queryObjectPattern.AddOr(i => i == 7);

            var intsThatPassed = queryObjectPattern.GetItemsUsingOrClauses(someInts);
            foreach (var i in intsThatPassed)
            {
                Console.WriteLine("{0} passed!", i);    
            }

        }

        public class QueryObjectPattern<T>
        {
            private readonly List<Func<T, bool>> _funcsToApply;

            public QueryObjectPattern()
            {
                _funcsToApply =  new List<Func<T, bool>>();
            }

            public void AddOr(Func<T, bool> orClause)
            {
                _funcsToApply.Add(orClause);
            }

            public IEnumerable<T> GetItemsUsingOrClauses(IEnumerable<T> items)
            {
                var itemsThatPassed = new List<T>();
                foreach (var func in _funcsToApply)
                {
                    itemsThatPassed.AddRange(items.Where(func));
                }
                return itemsThatPassed;
            }
        }
    }
}

答案 2 :(得分:0)

嗯,你可以,但你可以连接两个查询并获得不同的结果 它应该如下

        List<Point> Points = new List<Point>();
        var statementOne = Points.Where(d => d.X > 3);
        var statementTwo = Points.Where(d => d.X < 0);
        var queriedPoints = statementOne.Concat(statementTwo).Distinct();