2017-09-22 4 views
2

を得るにはTestRecordsと呼ばれ、モデルは次のようになります。GROUPBY()のは、私はデータベースのテーブルがあるとしましょう重複したレコードに

public class MyMainViewModel 
{ 
    public string Location {get;set;} 
    public IEnumerable<MyChildViewModel> Children {get;set;}  
} 

public class TestRecords 
{ 
    public int Id {get;set;} 
    public Date DateEntered {get;set;} 
    public int SecId {get;set;} 
    public int PhoneCallsTaken {get;set;} 
} 

、私はこのようになりますメインのviewmodelを持っています

そして、私の子供ビューモデル:

public class MyChildViewModel 
{ 
    public string Month { get; set; } 
    public string Year { get; set; } 
    public double TotalPhoneCalls { get; set; } 
} 

のは、データベースにのレコードがあるとしましょうテーブル。私は私の結果がなりたい何

TestRecords 

ID | DateEntered | SecId | PhoneCallsTaken 
------------------------------------------------------------- 
    1   8/1/2017    2     35 
    2   8/2/2017    2     30 
    5   9/1/2017    2     30 

私はちょうどdb.TestRecords.GroupBy(x => x.SecId)ある知っているSecIdによってグループにそれらのレコードをしたいと思います...それは私の混乱ではありません。

2 

Month | Year | Total Phone Calls 
------------------------------------------ 
August  2017    65 
August  2017    65 
September  2017    30 

2つのレコードがであるので、それは8月の合計を繰り返している。ここで

SecIdはここ2

2 

Month | Year | PhoneCallsTaken 
------------------------------------------ 
August  2017    65 
September  2017    30 

に等しい結果が、私が受けています何であるように私が期待するものですSecIdが2、月が8月のデータベース。ここで

は、私のC#のコードです:

var data = db.TestRecords.ToList(); 

IEnumerable<MyMainViewModel> model = data.GroupBy(x => x.Section.SectionName) 
             .Select(y => new MyMainViewModel() 
{ 
    Location = y.Key, 
    Children = y.Select(z => new MyChildViewModel() 
    { 
     Month = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(z.DateEntered.Month), 
     Year = z.DateEntered.Year.ToString(), 
     TotalPhoneCalls = y.Where(t => t.Section.SectionName == z.Section.SectionName) 
          .Sum(t => t.PhoneCallsTaken) 
    }).Distinct() 
}); 

どのように私は、同じ月/年に入力されたレコードは別個のもので入手できますか?

何か助けていただければ幸いです。

+2

両方のプロパティを持つ匿名オブジェクトによるグループ。 – Nkosi

+1

サンプル入力と期待される出力を備えたhttps://stackoverflow.com/help/mcveはすばらしいでしょう。 – mjwills

+0

返されるフィールドのみでtempオブジェクトを作成する必要があります。現在のデザインには、GroupByを実行するときにオブジェクトのすべてのプロパティが含まれています.SQLで同じステートメントを実行した場合、同様の結果が得られます – GoldBishop

答えて

2

ここに私がコメントで言及したものの基本的な要点があります。

var model = data.GroupBy(_ => _.Section.SectionName) 
    .Select(section => new MyMainViewModel { 
     Location = section.Key, 
     Children = section.GroupBy(_ => new { 
      Month = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(_.DateEntered.Month), 
      Year = _.DateEntered.Year.ToString() 
     }).Select(period => new MyChildViewModel { 
      Month = period.Key.Month, 
      Year = period.Key.Year, 
      TotalPhoneCalls = period.Sum(_ => _.PhoneCallsTaken) 
     }).ToList() 
    }); 

最初にセクション別にグループ分けしました。今度は、セクションを月と年でグループ化し、それらのグループの呼び出しを合計したいとします。

0

あなたの現在のLINQ:わずかに微調整

var data = db.TestRecords.ToList(); 

IEnumerable<MyMainViewModel> model = data.GroupBy(x => x.Section.SectionName).Select(y => new MyMainViewModel(){ 
    Location = y.Key, 
    Children = y.Select(z => new MyChildViewModel(){ 
      Month = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(z.DateEntered.Month), 
      Year = z.DateEntered.Year.ToString(), 
      TotalPhoneCalls = y.Where(t => t.Section.SectionName == z.Section.SectionName).Sum(t => t.PhoneCallsTaken) 
    }).Distinct() 
}); 

var data = db.TestRecords.Select(d => d.SecId, d.DateEntered, d.PhoneCallsTaken).ToList(); 

IEnumerable<MyMainViewModel> model = data.GroupBy(x => x.Section.SectionName).Select(y => new MyMainViewModel(){ 
    Location = y.Key, 
    Children = y.Select(z => new MyChildViewModel(){ 
      Month = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(z.DateEntered.Month), 
      Year = z.DateEntered.Year.ToString(), 
      TotalPhoneCalls = y.Where(t => t.Section.SectionName == z.Section.SectionName).Sum(t => t.PhoneCallsTaken) 
    }).Distinct() 
}); 

ニーズにdata変数の割り当てを変更し、変更がリストのあなたの後の使用に反映されていることを確認してください。

関連する問題