2017-03-24 6 views
0

コードの援助が必要です。 私は棒グラフで自分のデータを表示したいのですが、私はそれをもっと専門的に、そしてlinqのグループでやりたかったのですが、私はそうすることができませんでした。 グラフにGenetella Admin Layoutテンプレートを使用しています。 コントローラ部での私のコードでは、これは私が「m番目」と、カウントを取得するためにそれを分離してのDateTimeOffset形式で保存されて作成された日から月名を取得していてLinqとMvcを使用して棒グラフのデータを表示

public ActionResult Home() 
     { 
      int jan = 0,feb = 0,mar = 0,apr = 0,may = 0,jun = 0,jul = 0 ,aug = 0 ,sep = 0,oct = 0 ,nov = 0,dec = 0; 
      ViewData["Freetrialcompanies"] = admin.getAllCompanies(); 
      List<string> month = new List<string>(); 
      foreach (var cmpMonth in ViewData["Freetrialcompanies"] as IEnumerable<IntuitiveCrm.ViewModels.CompanyMasterViewModel>) 
      { 
       var mth = DateTimeOffset.Parse((cmpMonth.CreatedDate).ToString()).ToString("MMMM"); 
       month.Add(mth); 
       switch (mth) 
       { 
        case "January": 
         jan = jan + 1; 
         var Janmth = jan; 
         if(Janmth != 0) 
         { 
          ViewData["jan"] = Janmth; 
         } 
         else 
         { 
          ViewData["jan"] = 0; 
         } 

        break; 

        case "February": 
         feb = feb + 1; 
         var Febmth = feb; 
         if (Febmth != 0) 
         { 
          ViewData["feb"] = Febmth; 
         } 
         else 
         { 
          ViewData["feb"] = 0; 
         } 
         break; 

        case "March": 
         mar = mar + 1; 
         var Marmth = mar; 
         if (Marmth != 0) 
         { 
          ViewData["mar"] = Marmth; 
         } 
         else 
         { 
          ViewData["mar"] = 0; 
         } 
         break; 

        case "April": 
         apr = apr + 1; 
         var Aprmth = apr; 
         if (Aprmth != 0) 
         { 
          ViewData["apr"] = Aprmth; 
         } 
         else 
         { 
          ViewData["apr"] = 0; 
         } 
         break; 

        case "May": 
         may = may + 1; 
         var Maymth = may; 
         if (Maymth != 0) 
         { 
          ViewData["may"] = Maymth; 
         } 
         else 
         { 
          ViewData["may"] = 0; 
         } 
         break; 

        case "June": 
         jun = jun + 1; 
         var Junmth = jun; 
         if (Junmth != 0) 
         { 
          ViewData["jun"] = Junmth; 
         } 
         else 
         { 
          ViewData["jun"] = 0; 
         } 
         break; 

        case "July": 
         jul = jul + 1; 
         var Julmth = jul; 
         if (Julmth != 0) 
         { 
          ViewData["jul"] = Julmth; 
         } 
         else 
         { 
          ViewData["jul"] = 0; 
         } 
         break; 

        case "August": 
         aug = aug + 1; 
         var Augmth = aug; 
         if (Augmth != 0) 
         { 
          ViewData["aug"] = Augmth; 
         } 
         else 
         { 
          ViewData["aug"] = 0; 
         } 
         break; 

        case "September": 
         sep = sep + 1; 
         var Sepmth = sep; 
         if (Sepmth != 0) 
         { 
          ViewData["sep"] = Sepmth; 
         } 
         else 
         { 
          ViewData["sep"] = 0; 
         } 
         break; 

        case "October": 
         oct = oct + 1; 
         var Octmth = oct; 
         if (Octmth != 0) 
         { 
          ViewData["oct"] = Octmth; 
         } 
         else 
         { 
          ViewData["oct"] = 0; 
         } 
         break; 

        case "November": 
         nov = nov + 1; 
         var Novmth = nov; 
         if (Novmth != 0) 
         { 
          ViewData["nov"] = Novmth; 
         } 
         else 
         { 
          ViewData["nov"] = 0; 
         } 
         break; 

        case "December": 
         dec = dec + 1; 
         var Decmth = dec; 
         if (Decmth != 0) 
         { 
          ViewData["dec"] = Decmth; 
         } 
         else 
         { 
          ViewData["dec"] = 0; 
         } 
         break; 

       } 

      } 
      ViewData["Mnth"] = month; 
      return View(); 
     } 

以下の通りです。

私のcsファイルのコードはadmin.getAllCompanies();私は、以下のバーグラフを生成しています。これにより

public List<CompanyMasterViewModel> getAllCompanies() 
     { 
      var taskData = (from t in Comp.GetAll() 
          join p in plan.GetAll() 
          on t.PlanId equals p.PlanId 
          join f in freeTrial.GetAll() 
          on t.CompanyId equals f.CompanyId 
          where t.Status == 1 
          select new CompanyMasterViewModel 
          { 
           CompanyName = t.CompanyName, 
           PlanName = p.PlanName, 
           Email = t.Email, 
           CreatedDate = f.CreatedDate, 
           EndDate = f.EndDate, 
           Status = t.Status, 
          }).ToList<CompanyMasterViewModel>(); 
      return taskData; 
     } 

enter image description here

は、いずれかが良く、このコードを私を助けることができると私はORDERBYで(それはのDateTimeOffsetに保存されている)CreatedDateにし得るように、どのようにLINQクエリを記述すること唯一の月です。

ありがとうございます。

答えて

0

私はいくつかの異なる解決策を想像することができますが、あなたは次のことを試みるかもしれません。私はもっ​​と多くの場所でgetAllCompanies()メソッドを使用するのかどうか分かりませんが、私はそれが正しいと思いますので、このメソッドを変更するつもりはありません。 CompanyCountViewクラスは、私はきちんとしたものを維持するために作成された新しいビューモデルである

public IEnumerable<CompanyCountView> companyCountByMonth() 
{ 
    List<CompanyMasterViewModel> companies = this.getAllCompanies(); 
    ILookup<int, Company> byMonths = companies.ToLookup(key => key.CreatedDate.Month); 

    for (var i = 1; i <= 12; i++) 
    { 
     yield return new CompanyCountView 
     { 
      Date = new DateTime(2016, i, 1), 
      Count = months[i].Count() 
     }; 
    } 
} 

:あなたはこのようになり、ビジネスレイヤ内の別のメソッドを追加することができます

public class CompanyCountView 
{ 
    public DateTime Date { get; set; } 
    public int Count { get; set; } 
} 

コントローラでは、あなたはこの関数を呼び出すだけです。ビューでビューモデルを使用し、ViewDataを最小限に抑えることをお勧めします。メンテナンスの方がいいです。

public ActionResult Home() 
{ 
    IEnumerable<CompanyCountView> model = admin.companyCountByMonth(); 
    return View(model); 
} 

3文字の省略形を表示する必要があるビューです。ちょうどこれを使用してください:

@item.Date.ToString("MMM") 

私は年をどのように処理するか分かりません。チャートがすべてのエントリーから1年または数ヶ月以内に月を表示することになっている場合 - 何らかの種類の統計。特定の年の場合は、ハードコードされた値「2016」を必要な年に置き換えてください。

もう1つのケースで、月を保存するだけのDateTime型のインスタンスを作成したくない場合や、ローカリゼーションを考慮する必要がある場合。次に、少し異なるアプローチを使用することができます。最後のノートがgetAllCompanies()機能についてです

public IEnumerable<CompanyCountView> companyCountByMonth() 
{ 
    List<CompanyMasterViewModel> companies = this.getAllCompanies(); 
    ILookup<int, Company> byMonths = companies.ToLookup(key => key.CreatedDate.Month); 

    for (var i = 1; i <= 12; i++) 
    { 
     yield return new CompanyCountView 
     { 
      Date = (Months)i, 
      Count = months[i].Count() 
     }; 
    } 
} 

public class CompanyCountView 
{ 
    public Months Date { get; set; } 
    public int Count { get; set; } 
} 

companyCountByMonth()機能:あなただけ列挙

public enum Months { 
    Jan = 1, 
    Feb = 2, 
    Mar = 3 

    // etc. 
} 

を作成し、モデルビューCompanyCountviewを更新する必要があります。この関数がこの特定のビューに対してのみ作成された場合は、すべてをメモリにロードする前にクエリでgroup byを実行することを検討します。しかし、その場合は、私の解決策を調整する必要があります:)私はあなたが要点をどのように簡略化することができることを願っています。

関連する問題