gpt4 book ai didi

c# - 将 IQueryable Where 与具有多个参数的表达式一起使用

转载 作者:行者123 更新时间:2023-11-30 17:10:48 24 4
gpt4 key购买 nike

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

最佳答案

希望对您有所帮助。这是一种非常实用的编程方法。您可以创建一个函数(或表达式)返回一个函数并将该函数用于 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;

关于c# - 将 IQueryable Where 与具有多个参数的表达式一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11792505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com