2011-01-18 14 views
6

私は(約100のループでは5~10秒かかる)低速で実行されているクエリを持っており、なぜヒントがありません。それは単にオブジェクトのリストに対して照会するだけです...あなたの助けは大いに感謝しています!遅いLINQクエリ

私は基本的に、特定のマネージャに割り当てられたスケジュールを照会しています。これは、指定されたシフトの週または次の週の最初の2日または前の週の最後の2日からでなければなりません。

私は計算前に.AddDaysを試しましたが、それは助けになりませんでした。パフォーマンステストを実行すると、以下の「from」ステートメントが強調表示されました。コールの

List<Schedule> _schedule = Schedule.GetAll(); 
List<Shift> _shifts = Shift.GetAll(); 

// Then later... 
List<Schedule> filteredSchedule = (from sch in _schedule 
            from s in _shifts 
            where 
             **sch.ShiftID == s.ShiftID 
             & (sch.ManagerID == 1 | sch.ManagerID == 2 | sch.ManagerID == 3) 
             & ((s.ScheduleWeek == shift.ScheduleWeek) 
               | (s.ScheduleWeek == shift.ScheduleWeek.AddDays(7) 
                 & (s.DayOfWeek == 1 | s.Code == 2)) 
               | (sch.ScheduleWeek == shift.ScheduleWeek.AddDays(-7) 
                 & (s.DayOfWeek == 5 | s.Code == 6)))** 
            select sch) 
            .OrderBy(sch => sch.ScheduleWeek) 
            .ThenBy(sch => sch.DayOfWeek) 
            .ToList(); 

答えて

7

まずポート:&&の代わりに、&||の代わり|を使用しています。そうでなければの部分式は、答えがすでに分かっていても評価されます。

コールの

第二ポート:どこで句「から」ではなく2の結合を使用:基本的に

var filteredSchedule = (from sch in _schedule 
         join s in _shifts on s.ShiftID equals sch.ShiftID 
         where ... rest of the condition ... 

それは、すべてのシフトIDのハッシュを作成するために起こっているので、それはすぐにを調べることができます可能なは各スケジュールに一致します。

+0

まず、ありがとうございました。以前は短絡していましたが、違いに気づいていませんでした。しかし、 "どこで"の代わりに "参加"を使用しても動作しました!私はLINQが2つの異なった扱いをしたことは全く知りませんでした。 第2回 - うわー!私はちょうど有名人からの助けを得たように感じる!私はあなたの本を読んだことはありませんが、それは何度も見てきました。あなたは私が今でもコピーをピックアップすることを確信することができます。 :) p.s.あなたが開発者を探していたら私に教えてください!すなわち、あなたの次の本を共著すること!ハハ – jon