2011-09-16 45 views
1

请帮助我优化此linq语句以提高性能。有大约4000名司机需要经过并且页面超时。 我是相当新的LINQ的帮助优化此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) 
          ) 
        ); 
+0

你真的应该分别写你的子查询,然后结合它们。这至少应该使管理更容易。 –

+1

Optoimize什么?可读性,性能,内存消耗还是我忘记列出的东西? –

+0

你确定至少有一个满员:“e.OccuredAt

回答

4
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))); 
+0

谢谢你的建议。我正在优化linq的过程中,但恐怕问题可能在于我们如何实现automapper。 – crazyDiamond