使用连接构建lambda表达式

时间:2013-05-10 14:13:32

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

假设我有这两个实体:

  • 文档,其中包含DateTime属性(名为日期)。
  • 期间,其中包含两个代表一段时间的DateTime属性(称为 DateFrom DateTo )。

然后,考虑这个表达式,其中 d 代表文档 p 代表期间,用于过滤文档集合,仅返回属于给定期间的那些人:

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表达式,在过滤我的Document集合之前,我可以进一步结合其他条件。

2 个答案:

答案 0 :(得分:4)

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

(请注意,如果您希望文档处于任何期间而不是每个期间的文档,则可以将All更改为Any。)

答案 1 :(得分:0)

假设lambda表达式可以收集句点实体(句点):

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

   return cond;
}