我正在使用LINQ to Entities并在特定日期时间段内查询条目,该模型对象具有属性DateFrom
和DateTo
。为此,我可以使用以下命令创建序列
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>
答案 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;