使用IQueryable具有多个参数的表达式的位置

时间:2012-08-03 08:57:11

标签: c# linq linq-to-entities c#-3.0

我正在使用LINQ to Entities并在特定日期时间段内查询条目,该模型对象具有属性DateFromDateTo。为此,我可以使用以下命令创建序列

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集合(最好使用查询提供程序进行过滤而不是过滤内存中的对象)。 / p>

1 个答案:

答案 0 :(得分:2)

我希望这可以提供帮助。这是一种功能强大的编程方法。您可以创建一个返回函数的函数(或表达式),并将该函数用于Where。

如下所示:

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;