Подтвердить что ты не робот

Повторное использование запроса LINQ

Речь идет не о повторном использовании результата, а о самом выражении. Также не об ошибке при использовании var, как указано в: LINQ to SQL: повторное использование выражения лямбда

Из явного любопытства мне было интересно, можно ли повторно использовать один оператор LINQ.

Предположим, что у меня есть следующий оператор LINQ:

.Where(x => x.Contains(""));

Можно ли извлечь оператор x => x.Contains("") и использовать некоторую ссылку на это для последующего использования, скажем, другого класса?

Поэтому я могу назвать это следующим образом: .Where(previouslySavedStatement);

4b9b3361

Ответ 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);