2016-08-17 3 views
2

DateTimeの値がDatabaseに登録されている場合、Partのリストがあります。LINQを使用して時差平均を示します

1時間当たりのシフトと1泊のシフトで登録されたユーザーの数を表示したいとします。私はそれらの2つの値

@{ 

var shiftChangeTime = new TimeSpan(16, 0, 0); 
<table> 
    <tr> 
     @*This is my general average*@ 
     <td>Number of part/hour</td> 
     @{ 
      var avg = Model.GroupBy(x => ((DateTime)x.ScanTime).TimeOfDay.Hours) 
         .Average(x => x.Count()); 
      <td>@(Math.Round(avg, 2))</td> 
     } 
    </tr> 
    <tr> 
     @*This is my day average*@ 
     <td>Number of part/hour</td> 
     @{ 
      var avgDay = Model.GroupBy(x => ((DateTime)x.ScanTime).TimeOfDay < shiftChangeTime, y => ((DateTime)y.ScanTime).TimeOfDay.Hours) 
         .Average(x => x.Count()); 
      <td>@(Math.Round(avgDay, 2))</td> 
     } 
    </tr> 
    <tr> 
     @*This is my night average*@ 
     <td>Number of part/hour for night shift</td> 
     @{ 
      var avgNight = Model.GroupBy(x => ((DateTime)x.ScanTime).TimeOfDay > shiftChangeTime, y => ((DateTime)y.ScanTime).TimeOfDay.Hours) 
         .Average(x => x.Count()); 
      <td>@(Math.Round(avgNight, 2))</td> 
     } 
    </tr> 
</table> 
} 

に私の一般的な平均の私のロジックをベースにしてみました

私は現在、時間単位での昼/夜のシフトを分離するロジックで立ち往生しています。

今のところ、私の総数は2つに分割されています。

どのように進めていいですか?

答えて

1

上記のコードの問題は、GroupByの昼/夜のシフトの後に、時間平均を行うためにHourでグループ化する必要があることです。これはあなたの昼/夜のシフト時の時間内の部品の平均を与える

List<Part> Model = new List<Part> 
{ 
    new Part{ ScanTime = new DateTime(2016,1,1,1,0,0) }, 
    new Part{ ScanTime = new DateTime(2016,1,1,4,0,0) }, 
    new Part{ ScanTime = new DateTime(2016,1,1,4,0,0) }, 
    new Part{ ScanTime = new DateTime(2016,1,1,4,0,0) }, 
    new Part{ ScanTime = new DateTime(2016,1,1,4,0,0) }, 
    new Part{ ScanTime = new DateTime(2016,1,1,7,0,0) }, 
    new Part{ ScanTime = new DateTime(2016,1,1,12, 0,0) }, 
    new Part{ ScanTime = new DateTime(2016,1,1,17,0,0) }, 
    new Part{ ScanTime = new DateTime(2016,1,1,19,0,0) }, 
    new Part{ ScanTime = new DateTime(2016,1,1,23,0,0) }, 
}; 

var shiftChangeTime = new TimeSpan(12, 0, 0); 

var result = Model.GroupBy(x => x.ScanTime.TimeOfDay < shiftChangeTime ? "Day" : "Night") 
    .Select(g => new 
    { 
     Shift = g.Key, 
     Average = g.GroupBy(item => item.ScanTime.Hour, 
          (key, group) => new { Hour = key, Amount = group.Count() }) 
        .Average(y => y.Amount) 
    }).ToList(); 

したくない場合は別のオプション2 GroupByは、特定のシフトとのレコードだけを維持するために最初に使用Whereです残りの部分:

var dayAverage = Model.Where(x => x.ScanTime.TimeOfDay < shiftChangeTime) 
         .GroupBy(item => item.ScanTime.Hour, 
           (key, group) => new { Hour = key, Amount = group.Count() }) 
         .Average(y => y.Amount); 
+0

「結果」には2つの値が含まれている必要があります.1つは日シフト平均であり、もう1つは夜間平均です。私は 'result [" day "]/result [" night "]'を実行してそれらにアクセスします。 – Chax

+1

@Chax - あなたは 'result [0]'のようにアクセスする必要があります。あなたが書いた方法でアクセスしたいなら、 'ToList'の代わりに' ToDictionary'を実行してください –

+0

素晴らしい!ありがとう。私はこれをすぐに試して、これが動作するかどうかを確認します – Chax

関連する問題