使用连接构建lambda表达式

本文关键字:lambda 表达式 构建 连接 | 更新日期: 2023-09-27 18:13:06

假设我有两个实体:

  • 文档,其中包含一个DateTime属性(称为Date)。
  • Period,包含两个DateTime属性(称为DateFromDateTo),表示一段时间。
然后,考虑这个表达式,其中d表示Documentp表示Period,用于过滤Document集合,只返回属于给定Period的集合:
d => d.Date >= p.DateFrom && d.Date <= p.DateTo

问题是,给定一个Period实体集合,我如何构建一个lambda表达式来表示像上面表达式一样的多个表达式的连接,所以它给出:

d => 
     (d.Date >= p1.DateFrom && d.Date <= p1.DateTo) 
  && (d.Date >= p2.DateFrom && d.Date <= p2.DateTo) 
  && (d.Date >= p3.DateFrom && d.Date <= p3.DateTo) 
  && ...

我希望结果是一个lambda表达式,我可以在过滤文档集合之前将其进一步组合到其他条件。

使用连接构建lambda表达式

var documentsInAllPeriods = documents.Where(d => periods.All(p => 
    d.Date >= p.DateFrom && d.Date <= p.DateTo));

(注意,如果您希望文档在任何时间段内而不是在每个时间段内,您可以将All更改为Any)

假设句号实体(句号)的集合可用于lambda表达式:

(d) => 
{ 
   bool cond = false;
   foreach(Period p in periods)  
   {
      // check period
      // return earlier if condition not met
   }
   return cond;
}