where e.tblDriverStatusChanges.Where(x => !x.RemovedAt.HasValue).Count() > 0
Вы используете Count() > 0
, когда должны использовать Any()
: это даст вам хотя бы некоторое ускорение (происходит 3 раза в вашем запросе):
where e.tblDriverStatusChanges.Any(x => !x.RemovedAt.HasValue)
Вы также можетехотите предварительно определить и получить результаты для этого запроса, чтобы вам не приходилось повторять запрос 3 раза, например:
var subset = (from e in driver.tblDriverLogEntries
where e.tblDriverStatusChanges.Any(x => !x.RemovedAt.HasValue)
select e).ToList();
var entries = (from e in subset
where e.OccuredAt <= utcEnd &&
e.OccuredAt >= utcViolationsStart
select e).Union(
//previous amended status
(from e in subset
where e.OccuredAt < utcViolationsStart
orderby e.OccuredAt descending
select e).Take(1).Union(
//next amended status
(from e in subset
where e.OccuredAt > utcEnd
orderby e.OccuredAt ascending
select e)));