Повторное использование запроса LINQ
Речь идет не о повторном использовании результата, а о самом выражении.
Также не об ошибке при использовании var, как указано в: LINQ to SQL: повторное использование выражения лямбда
Из явного любопытства мне было интересно, можно ли повторно использовать один оператор LINQ.
Предположим, что у меня есть следующий оператор LINQ:
.Where(x => x.Contains(""));
Можно ли извлечь оператор x => x.Contains("")
и использовать некоторую ссылку на это для последующего использования, скажем, другого класса?
Поэтому я могу назвать это следующим образом: .Where(previouslySavedStatement);
Ответы
Ответ 1
Вы можете сохранить его в переменной. Если вы работаете с IQueryable
, используйте:
System.Linq.Expressions.Expression<Func<Foo, bool>> selector = x => x.Contains("");
Если вы используете IEnumerable
, используйте:
Func<Foo, bool> selector = x => x.Contains("");
И используйте его в своем запросе:
query.Where(selector);
Ответ 2
Да, вы можете написать функцию, содержащую запрос, который вы хотите повторно использовать, который принимает и возвращает IQueryable <T>
public IQueryable<T> ContainsEmpty(IQueryable<T> query)
{
return query.Where(x => x.Contains(""));
}
Теперь вы можете его повторно использовать:
query1 = ContainsEmpty(query1);
query2 = ContainsEmpty(another);
Ответ 3
Это зависит. Там два метода Where
, Enumerable.Where
и Queryable.Where
. Если вы применяете .Where
к IEnumerable
, чем вызывается первый, если вы применяете его к IQueryable
, вызывается второй.
Так как Enumerable.Where
принимает a Func
, он не может использоваться повторно. Поскольку Queryable.Where
принимает выражение, оно может использоваться повторно. Вы можете сделать это следующим образом:
var x = new List<string>().AsQueryable();
var query = x.Where (n => n.Contains("some string"));
//Extract the lambda clause
var expr = query.Expression;
var methodExpr = (MethodCallExpression)expr;
var quoteExpr = (UnaryExpression)methodExpr.Arguments[1];
var funcExpr = (Expression<Func<string, bool>>)quoteExpr.Operand;
Затем вы можете повторно применить выражение where:
var query2 = x.Where(funcExpr);