请帮助我优化此 linq 语句以提高性能。大约有 4000 个驱动程序要经过,页面超时。 我对 Linq 比较陌生
tblDriver driver = Mapper.Map<Domain.Driver, tblDriver>(driverDto);
var entries = (from e in driver.tblDriverLogEntries
where e.OccuredAt <= utcEnd &&
e.OccuredAt >= utcViolationsStart &&
e.tblDriverStatusChanges.Where(x => !x.RemovedAt.HasValue).Count() > 0
select e).Union(
//previous amended status
(from e in driver.tblDriverLogEntries
where e.tblDriverStatusChanges.Where(s => !s.RemovedAt.HasValue).Count() > 0
&& e.OccuredAt < utcViolationsStart
orderby e.OccuredAt descending
select e).Take(1).Union(
//next amended status
(from e in driver.tblDriverLogEntries
where e.tblDriverStatusChanges.Where(s => !s.RemovedAt.HasValue).Count() > 0
&& e.OccuredAt > utcEnd
orderby e.OccuredAt ascending
select e)
)
);
最佳答案
where e.tblDriverStatusChanges.Where(x => !x.RemovedAt.HasValue).Count() > 0
当您应该使用 Any()
时,您正在使用 Count() > 0
:这至少会给您一些加速(在您的查询中出现 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)));
关于c# - 帮助优化这个linq语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7440056/