2012-01-11 21 views
1

最高...私はスタッフを自動生成するアプリケーションを書いているLINQクエリは、MAXの日付を返すために

をこれを説明するので、私と一緒に負担する方法がわかりませんロータ。

私はテーブル(tl_RotaDays)を持っています。これは基本的にどのスタッフがその特定の日に電話をかけたかを記録しています。私は、彼らが働いているの週として定義される「完全な」週に基づいて、それぞれの人が働いていた最後の「フル」ワーキング(月〜金)の週に金曜日の日付を返したい

Date   Login 
--------------------------- 
02-01-2012  Bob 
03-01-2012  Bob 
04-01-2012  Bob 
05-01-2012  Bob 
06-01-2012  Bob 

09-01-2012  Bob 
10-01-2012  Bob 
11-01-2012  Bob 
12-01-2012  Sue 
13-01-2012  Sue 

> = 3日。

上記の例のように、スーは週の終わりに働いたとしても、彼がその週の過半数を稼働したので、 "Bob"のクエリは "13-01-2012"を返す必要があります。

私は一人一人が働いていた最後の日付を取得するクエリがあります。

lastEveningOOH = Convert.ToDateTime((from rd in db.tl_rotaDays 
           where rd.ooh == tc.login && ((int)Convert.ToDateTime(rd.date).DayOfWeek >= 1 && 
              (int)Convert.ToDateTime(rd.date).DayOfWeek <= 5) 
           select rd.date).Max()), 

をしかし、私は人が「フル」週間働いていたかどうかをチェックするために考えることができる唯一の方法は、それぞれに対して元のテーブルを照会することですこれは恐ろしく非効率的なようだ。

+0

**もしあなたがコード、XML、またはデータサンプルを投稿するなら、テキストエディタでこれらの行を強調表示し、エディタツールバーの "コードサンプル"ボタン( '{}')をクリックすると、それ! –

+0

あなたはどうでしたか?それは私がやったようにそれをタイプすることを迷惑な方法です。 – Ben

+0

私が言及したように:あなたのデータを入力し、それらの行をエディタでハイライトし、中括弧をクリックするか、キーボードのCtrl-Kを押すか、入力から4つのスペースで入力します。同じ。 –

答えて

1

dtは日付のリストである場合は、次のように1のLINQ-クエリでそれを行うことができます:目的はあなたがLinq2Sqlがここに生成内容を確認していないかどうかを確認することができ、SQLクエリを最適化することである場合

DateTime maxWeek = 
      dt.Where(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday).GroupBy(
       d => new GregorianCalendar().GetWeekOfYear(d, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)).Where(
        g => g.Count() > 2).OrderBy(g => g.Key).Last().Max(); 

単純なアルゴリズムのアプローチ(最大の日付を見て=>完全な週をチェックする=>最大の日付を見る - 7など)が一番うまくいきます。 また、上記のLinqクエリは、日付が複数年にわたる場合には間違っている可能性がありますが、グループ化を修正してそれを修正することができます。

+0

ありがとうございました! – Ben

関連する問題