2012-08-03 3 views
3

Я использую LINQ to Entities и запрашиваю записи в течение определенного периода времени, хранящегося в объекте модели, который имеет свойства DateFrom и DateTo. Для этого можно использовать следующую команду, чтобы создать последовательностьИспользование IQueryable Где с выражениями с более чем одним параметром

var allActiveLogs = this.repository.RoutePerformanceLogs 
     .Where(log => log.Date >= model.DateFrom.Value && 
       log.Date <= model.DateTo.Value) 

Если я хочу абстрагироваться это для повторного использования я могу создать следующее выражение (пока модель находится в области видимости).

Expression<Func<RoutePerformanceLog, bool>> logWithinDateBounds = log => 
     log.Date >= model.DateFrom.Value && log.Date <= model.DateTo.Value; 

и потом называют

var allActiveLogs = this.repository.RoutePerformanceLogs.Where(logWithinDateBounds) 

То, что я хотел бы сделать, это абстрактное это выражение далее, к коду, где модель не в объеме, возможно, используя выражение подписи

Expression<Func<RoutePerformanceLog, DateTime?, DateTime?, bool>> logWithinDateBounds 

Однако это не будет работать внутри метода Where, так как метод where требует Func<T, boolean> или Expression<Func<T, boolean>>.

Возможно ли использовать многоразовое выражение, которое принимает более одного параметра и может использоваться для фильтрации коллекции IQueryable (предпочтительно с использованием поставщика запроса для фильтрации, а не для фильтрации объектов в памяти).

ответ

2

Надеюсь, это поможет. Это довольно функциональный подход к программированию. Вы можете создать функцию (или выражение), возвращающую функцию и используя эту функцию для «Где».

Что-то вроде следующего:

Func<int, int, Func<int,bool>> func = (x, y) => z=> x + y > z; 
var list = new List<int> { 1, 2, 3, 4, 5, 6 }; 

Console.WriteLine("How many greater than 2+1? {0}", 
        list.Where(func(1, 2)).Count()); 
Console.WriteLine("How many greater than 3+1? {0}", 
        list.Where(func(3, 1)).Count()); 
Console.WriteLine("How many greater than 2+3? {0}", 
        list.Where(func(2, 3)).Count()); 
Console.ReadKey(); 

В вашем случае вам необходимо:

Func<DateTime, DateTime, Expression<Func<RoutePerformanceLog, bool>>> logWithinDateBounds =   
    (dateFrom, dateTo) => 
     log => log.Date >= dateFrom && log.Date <= dateTo; 
Смежные вопросы