1

1 年全体の時間を月ごとに合計しようとしています。ただし、週の途中で終了して開始する月の問題に遭遇しました。これが私の解決策ですが、この特定の週の日付で機能するようにlinqをハードコーディングする必要がありました。この例では、

 WeekStart is Febuary 26 2012 - SUNDAY
    WeekEnd is March 1 2012 - THURSDAY

通常の週の場合のハードコードされた例では、これが使用されます(sumvalを参照)

.ToUpper()).Sum(y => y.TOTALHOURS).Value;

翌月の分割週の場合に使用します (sumval1 を参照)

.ToUpper()).Sum(y => y.THURSDAY + y.FRIDAY + y.SATURDAY).Value;

前月の分割週の場合(sumval2参照)

.ToUpper()).Sum(y => y.SUNDAY + y.MONDAY + y.TUESDAY + y.WEDNESDAY).Value;

これらに基づいて、時間は 2 か月に分割された週の適切な月に課金されます。

問題は、これらの曜日をハードコーディングしたくないということです。sumval1 と sumval2 に追加する必要がある曜日を動的に入力するにはどうすればよいですか

  double sumval =    data.Where(x => 
    //ExportHelper.isSplitWeek(x.WKENDDATE, x.WKENDDATE.AddDays(6)) != true &&
    x.PORTFOLIO.ToUpper() == item.portfolio.ToUpper() &&
    x.PHASE.ToUpper() == portitem.phase.ToUpper() && 
    x.PHASEDESCRIPTION.ToUpper() == portitem.phasedesc.ToUpper() && 
    x.WKENDDATE.ToString("MMM yyyy").ToUpper() == monitem.monthname.ToString() 
   .ToUpper()).Sum(y => y.TOTALHOURS).Value;


  double sumval1 =
       data.Where(x =>
       ExportHelper.isSplitWeek(x.WKENDDATE, x.WKENDDATE.AddDays(6)) == true &&
       x.PORTFOLIO.ToUpper() == item.portfolio.ToUpper() &&
       x.PHASE.ToUpper() == portitem.phase.ToUpper() &&
       x.PHASEDESCRIPTION.ToUpper() == portitem.phasedesc.ToUpper() &&
       ExportHelper.getSplitEndDate(x.WKENDDATE).AddDays(1).ToString("MMM yyyy").ToUpper() == monitem.monthname.ToString()
      .ToUpper()).Sum(y => y.THURSDAY + y.FRIDAY + y.SATURDAY).Value;



  double sumval2 =
      data.Where(x =>
      ExportHelper.isSplitWeek(x.WKENDDATE, x.WKENDDATE.AddDays(6)) == true &&
      x.PORTFOLIO.ToUpper() == item.portfolio.ToUpper() &&
      x.PHASE.ToUpper() == portitem.phase.ToUpper() &&
      x.PHASEDESCRIPTION.ToUpper() == portitem.phasedesc.ToUpper() &&
      x.WKENDDATE.ToString("MMM yyyy").ToUpper() == monitem.monthname.ToString()
     .ToUpper()).Sum(y => y.SUNDAY + y.MONDAY + y.TUESDAY + y.WEDNESDAY).Value;
4

1 に答える 1

1

データをどのように表示したいかをより代表するカスタムクラスにデータを入れたほうがよいと思います。週末の日付を比較し、各曜日のプロパティにアクセスしていることを考えると、データは週単位であると想定しています。

それを考えると、どのタイプでも、毎日の実際の表現を使用dataして、毎日のレベルで何かに変換することをお勧めします。datetime次のようなクラスを作成するとします。

public class MyClass
{
    DateTime Date {get;set;}
    int Val {get;set;}
    ... //other properties
}

data1 つのレコードを次のような一連のインスタンスに変換できます(土曜日を表すとMyClass仮定します)。WKENDDATE

List<MyClass> transformed = new List<MyClass>
foreach(var item in data)
{
    var sunday = new MyClass{Date = item.WKENDDATE.AddDays(-6), Val = item.SUNDAY};
    var monday = new MyClass{Date = item.WKENDDATE.AddDays(-5), Val = item.MONDAY};
    ...
    transformed.Add(sunday);
    transformed.Add(monday);
    ...
}

この形式でデータを取得したら、月ごとに合計するのは簡単です。

int month = 1; 
int year = 2012; 
var jan2012 = transformed.Where(x => x.Date.Month == month && x.Date.Year == year).Sum(x=>x.Val);
于 2012-04-06T00:07:16.303 に答える