У меня была та же проблема, и я хотел сохранить возможность использовать методы расширения в синтаксисе запроса (как с обычными поддерживаемыми функциями ...). Решением может быть эта библиотека (спойлер: я автор).
Вы просто реализуете метод повторного использования дважды, один раз для общего использования и один раз для запросов.
public static class MyFunctions {
[InjectLambda]
public static bool IsAGoodProduct(Product product) {
return product.Quality>3;
}
public static Expression<Func<Product,bool>> IsAGoodProduct() {
return (p) => p.Quality>3;
}
}
Фактический запрос может выглядеть как ожидаемый.
var goodProds = from p in dataContext.Products.ToInjectable()
where p.IsAGoodProduct()
select p;
Вызов ToInjectable
создает облегченный прокси, который заменяет вызов метода IsAGoodProduct
(если помечен соответствующим образом) на желаемое лямбда-выражение. Таким образом, вы можете использовать методы расширения везде, где внутри запроса работают параметризованные методы.