3

我正在使用 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 方法需要 aFunc<T, boolean>或 a Expression<Func<T, boolean>>

是否有可能有一个可重用的表达式,它需要多个参数并且可用于过滤IQueryable集合(最好使用查询提供程序进行过滤,而不是过滤内存中的对象)。

4

1 回答 1

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;
于 2012-08-03T09:22:54.893 回答