[英]Help optimize this linq statement
请帮我优化这个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)));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.