Я не пробовал это на EF, но на Linq для объектов он работает нормально:
var result = source
.OrderBy(x => x.start)
.GroupBy(x => x.start < startDate)
.SelectMany((x, i) => i == 0 ? new[] {new { value = x.Last().value, start = x.Last().start }} : x.Where(y => y.start < endDate));
Проблема в том, что в C # LINQ отсутствует оператор, который дает вам доступ к предыдущему элементу в последовательности. F #, видимо, может справиться с этим. Обходные пути включали либо GroupBy, либо Aggregate. В этом случае GroupBy может справиться с этим.
Это не красиво, и я бы не рекомендовал использовать его в двухфазном подходе.