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

私はすることによって私の期待される結果を生み出すことができます

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});

最後のActionIDを取得するために使用したハックは本当に好きではありません。また、1つのLINQステートメント内でこれを実行できるようにしたいと考えています。これを達成するために何をする必要がありますか?

4

2 に答える 2

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
                    });

編集:これは、actionidが最大および最小の開始日ほど重要ではないことを前提としています。これは、アクションIDが順序付けられ、最初と最後の訪問が時間差を計算するために使用される別のソリューションです。

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
                    });
于 2013-03-04T22:40:06.553 に答える
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() });

ちょっとしたハックを使用して、各訪問のすべての開始日と終了日を追加し、差を取得しました。

于 2013-03-04T22:53:05.513 に答える