2013-03-04 15 views
7

私は、訪問中に何が起こったかを記録したテーブルを持っています。訪問ごとに、何が行われたのかを示す複数の行があります。テーブルは次のようになります。異なる行の異なる列の差を計算する

VisitID | ActionID | StartTime | EndTime 
    0 | 0  | 1/1/2013 | 1/2/2013 
    1 | 0  | 1/2/2013 | 1/4/2013 
    1 | 1  | 1/4/2013 | 1/7/2013 
    2 | 0  | 1/4/2013 | 1/5/2013 
    2 | 1  | 1/5/2013 | 1/6/2013 
    2 | 2  | 1/6/2013 | 1/7/2013 

訪問にかかる時間を取得できるLINQクエリを作成したいと考えています。 TotalTimeは、最初と最後(最低と最高)のActionIDを見つけて次にlast.EndTime - first.StartTimeを見つけることによって計算されます。期待される結果:

VisitID | TotalTime 
    0 | 1 
    1 | 5 
    2 | 3 

私は、私は本当に私が最後たActionを取得するために使用ハックを好きではない、と私は本当にできるようにしたいと思い

var first = db.Visits.Where(v => v.ActionID == 0) 
var last = db.Visits.GroupBy(x => x.VisitID).Select(g => g.OrderByDescending(x => x.ActionID).First()) 

first.Join(last, f => f.VisitID, l => l.VisitID, (f, l) new{ VisitID = Key, TotalTime = l.EndTime - f.StartTime}); 

を行うことによって、私の期待通りの結果を生成することができます1 LINQステートメント内でこれを行います。これを達成するために私は何をする必要がありますか?

私は、これは動作するはずだと思う

答えて

4

...

var result = db.Visits.GroupBy(v => v.VisitID) 
      .Select(g => new 
        { 
         VisitId = g.Key, 
         TotalTime = g.Max(v => v.EndTime).Subtract(g.Min(v => v.StartTime)).Days 
        }); 

編集:これは、たActionは、最大値と最小開始日などはあまり重要ではありません想定しています。ここでは、actionidが順序付けられ、最初と最後の訪問が時間差を計算するために使用される別の解決法があります。各訪問のためのすべての開始日と終了日を追加し、その差を得るために少しハックを使用し

var result2 = db.Visits.GroupBy(v => v.VisitID) 
      .Select(g => new 
        { 
         VisitId = g.Key, 
         TotalTime = 
        g.OrderBy(v => v.ActionID).Last().EndTime.Subtract(g.OrderBy(v => v.ActionID).First().StartTime).Days 
        }); 
+1

+1また、私は彼がトータルデートを望んでいると思っています、全タイムスパンではありません。 –

+1

@lazyberezovskyいいキャッチです。私は日数を返す答えを更新しました。しかし、EFクエリのように見えるので、このクエリがEntity Frameworkで動作するかどうかはわかりません。 –

+1

もちろん! VisitIDでグループ化し、 'min'と' max'を使用します。ブロッキーは、おそらくあいまいな質問に両方の答えを提供することを指摘する – Jeff

0
db.Visits.GroupBy(v => v.VisitID) 
    .Select(g => new { VisitId = g.Key, 
      Days = g.Select(x => x.EndTime.ToOADate()).Sum() 
      -g.Select(x => x.StartTime.ToOADate()).Sum() }); 

関連する問題