2011-09-16 5 views
1

このlinq文を最適化してパフォーマンスを向上させてください。通過するドライバは約4000台あり、ページがタイムアウトします。あなたがAny()を使用する必要があるときは、Count() > 0を使用しているこの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

何のために最適化しますか?読みやすさ、パフォーマンス、メモリ消費量、または何かを忘れてしまったことがありますか? –

+0

少なくとも1つのフルフィルが常にあることを確かめてください: "e.OccuredAt

答えて

4
where e.tblDriverStatusChanges.Where(x => !x.RemovedAt.HasValue).Count() > 0 

私はLINQのにかなり新しいです:

where e.tblDriverStatusChanges.Any(x => !x.RemovedAt.HasValue) 
:これはあなたに、少なくともいくつかの高速化を提供します(あなたのクエリで3回発生)

このクエリの結果を事前に定義して取得して、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を最適化するプロセスに入っていますが、問題がオートマッパーをどのように実装しているのか疑問に思うのです。 – crazyDiamond

関連する問題