У меня есть запрос LINQ, который выглядит следующим образом:
DateTime today = DateTime.UtcNow;
var results = from order in context.Orders
where ((order.OrderDate <= today) && (today <= order.OrderDate))
select order;
Я пытаюсь изучить / понять LINQ. В некоторых случаях мне нужно добавить два дополнительных предложения WHERE. Чтобы сделать это, я использую:
if (useAdditionalClauses)
{
results = results.Where(o => o.OrderStatus == OrderStatus.Open) // Now I'm stuck.
}
Как видите, я знаю, как добавить дополнительное предложение WHERE. Но как мне добавить несколько? Например, я бы хотел добавить
WHERE o.OrderStatus == OrderStatus.Open AND o.CustomerID == customerID
на мой предыдущий запрос. Как это сделать с помощью методов расширения?
Спасибо!
Вы можете продолжить их цепочку, как вы это сделали.
Это представляет собой И.
источник
Если вы работаете с данными в памяти (читайте «коллекции POCO»), вы также можете складывать свои выражения вместе с помощью PredicateBuilder следующим образом:
// initial "false" condition just to start "OR" clause with var predicate = PredicateBuilder.False<YourDataClass>(); if (condition1) { predicate = predicate.Or(d => d.SomeStringProperty == "Tom"); } if (condition2) { predicate = predicate.Or(d => d.SomeStringProperty == "Alex"); } if (condition3) { predicate = predicate.And(d => d.SomeIntProperty >= 4); } return originalCollection.Where<YourDataClass>(predicate.Compile());
Полный источник упомянутого
PredicateBuilder
ниже (но вы также можете проверить исходную страницу с еще несколькими примерами):using System; using System.Linq; using System.Linq.Expressions; using System.Collections.Generic; public static class PredicateBuilder { public static Expression<Func<T, bool>> True<T> () { return f => true; } public static Expression<Func<T, bool>> False<T> () { return f => false; } public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) { var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ()); return Expression.Lambda<Func<T, bool>> (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters); } public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) { var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ()); return Expression.Lambda<Func<T, bool>> (Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters); } }
Примечание . Я тестировал этот подход с помощью проекта Portable Class Library и должен использовать,
.Compile()
чтобы он работал:источник
Конечно:
if (useAdditionalClauses) { results = results.Where(o => o.OrderStatus == OrderStatus.Open && o.CustomerID == customerID) }
Или просто еще один
.Where()
вызов, подобный этому (хотя я не знаю, зачем вам это нужно, если он не разделен другой логической управляющей переменной):if (useAdditionalClauses) { results = results.Where(o => o.OrderStatus == OrderStatus.Open). Where(o => o.CustomerID == customerID); }
Или другое переназначение на
results
: `results = results.Where ( бла ).источник
вы можете использовать && и записать все условия в одно и то же предложение where или вы можете .Where (). Where (). Where () ... и так далее.
источник
Выбор не требуется, так как вы уже работаете с заказом.
источник
Просто используйте
&&
оператор, как и любой другой оператор, который вам нужен для логической логики.if (useAdditionalClauses) { results = results.Where( o => o.OrderStatus == OrderStatus.Open && o.CustomerID == customerID) }
источник