2

労働時間を合計する必要があります。startTimeendTimeの2つのフィールドがあります。「日時」と「null許容」です

これを試しましたが、エラーが返されます:

var timeWorked = res.AsEnumerable()
                    .Sum(f => f.endTime.HasValue ? f.endTime.Value : 0 - f.startTime .HasValue ? f.startTime .Value : 0);

エラー:「演算子'-'はタイプ'bool'および'int'のオペランドには適用できません」

上記のコードは次のコンテキストにあります

 try
 {                           
     using (serviciosDBDataContext miDataContext = new serviciosDBDataContext("Data Source='xxxxxxx'"))
      {
          var res = (from p in miDataContext.works
                     select new
                      {
                           p.idWork,
                           p.status,
                           p.amount,
                           p.startTime,
                           p.endTime    
                      }).ToList();                                 
//HOURS WORKED

    var timeWorked = res.AsEnumerable()
                        .Sum(f => f.endTime.HasValue ? f.endTime.Value : 0 - f.startTime .HasValue ? f.startTime .Value : 0);       
      }    
 }
 catch (Exception)
 {
        MessageBox.Show(AppResources.errCargaEstad);
 }
4

1 に答える 1

3

ここでGetValueOrDefaultメソッドとAggregateメソッドを使用できます。

var timeWorked = res.AsEnumerable().Aggregate(TimeSpan.Zero, (total, f) => total + (f.endTime.GetValueOrDefault() - f.startTime.GetValueOrDefault());

参考までに、あなたの例では優先順位の問題があります。つまり、以下が評価されます。

f.endTime.HasValue ? f.endTime.Value : (0 - f.startTime.HasValue)

intまた、anとaの間に暗黙の変換がないDateTimeため、条件付き三項演算子は成功しません。

アップデート

TimeSpanの...プロパティにアクセスしてTotalMilliseconds、数値型を必要とするメソッドでこれらの値を使用できますが、期間を処理する場合、TimeSpan構造体はこの目的のために特別に作成され、コードについての推論がはるかに簡単です。TotalSeconds

アップデート2

さて、あなたの労働時間のコメントに基づいて、名前に単位が指定されていない時間を表すintは誤解される可能性があるため、変数の名前timeWorkedをからに変更することをお勧めします。hoursWorked必要なプロパティはTotalHoursです。これはを返します。double明示的ににキャストできますがint、精度が低下する可能性があります。

var hoursWorked = (int)res.Sum(f => (f.endTime.GetValueOrDefault() - f.startTime.GetValueOrDefault()).TotalHours);

また、リストToListを作成resするために呼び出しているので、これは結果をメモリに強制します。したがって、への呼び出しAsEnumerableは不要です。

于 2012-06-17T09:33:23.970 に答える