2013-05-10 2 views
1

Допустим, у меня есть эти две сущности:Построение лямбда-выражения с использованием конкатенации

  • документ, который содержит свойство DateTime (так называемый Дата).
  • Период, который содержит два свойства DateTime (так называемый DateFrom и DateTo), который представляет собой период времени.

Затем рассмотрит это выражение, в котором д представляет собой документа и р представляет собой Период, который используется для фильтрации документа коллекции для возврата только тех, кто является частью данный Период:

d => d.Date >= p.DateFrom && d.Date <= p.DateTo 

проблема заключается в том, дали Collectio п Период субъектов, как я мог бы построить лямбда-выражение, которое представляет собой конкатенацию нескольких выражений, как выше выражение, так что это дает:

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) 
    && ... 

Я хочу, чтобы результат выражениялямбды, что я могу в дополнение к другим условиям, прежде чем фильтровать мою коллекцию документов.

+0

Не будет ли проще ограничивать набор результатов поэтапно, а не все в одном большом && fest? Если вы используете Linq, он все равно их построит, пока вы не запросите данные. –

ответ

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

(Примечание Вы можете изменить All к Any, если вы хотите, чтобы документы в любой период, а не документы в каждый период.)

+0

Я уточнил свой вопрос, чтобы уточнить, что я хочу достичь. Я хочу иметь возможность объединить это выражение с другим предикатом. – 2013-05-10 14:18:54

+0

@JoanLeaven Кажется, вы не особенно знакомы с терминологией, которую используете, потому что этот ответ соответствует точным критериям вашего вопроса. FYI Я бы подумал, что это будет работать либо для 'IQueryable', либо для' IEnumerable'. Вы пробовали это и видели, что это не работает для 'IQueryable'? – Servy

+0

Это потому, что я не нашел способ сделать эту работу: http://stackoverflow.com/questions/16469268/building-a-custom-predicate-to-act-as-a-filter-using-a-foreach -loop – 2013-05-10 14:21:50

0

Предполагая коллекцию периода сущностей (периоды) доступна для лямбда-выражение:

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

    return cond; 
}