2017-03-24 62 views
0

想要幫助的代碼。 我想在一個條形圖上顯示我的數據,但我希望能夠更專業地完成這個工作,並且在linq中進行分組,但是我無法做到這一點。 我正在使用Genetella管理佈局模板來繪製圖表。 我的控制器部分的代碼如下使用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(); 
     } 

在此我得到的創建日期存儲在DATETIMEOFFSET格式「第m」和分離它獲得數月的名稱。

我的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

任何一個可以幫助我更好的代碼以及如何編寫LINQ查詢,以便我在排序依據得到createddate(它存儲在DATETIMEOFFSET)只有一個月。

謝謝。

回答

0

我可以想象幾種不同的解決方案,但您可以嘗試以下方法。我不知道你是否在更多地方使用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 = new DateTime(2016, i, 1), 
      Count = months[i].Count() 
     }; 
    } 
} 

的CompanyCountView類是我創建讓事情變得整潔一新的視圖模式:

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") 

我不知道你如何處理多年。如果圖表應該在所有條目的一年或幾個月內顯示幾個月 - 某種統計數據。如果僅僅是某一年,只需將我的硬編碼值「2016」替換爲您需要的年份即可。

如果是另一種情況,並且您不想創建DateTime類型的實例來存儲一個月份,或者您需要考慮本地化。然後你可以使用稍微不同的方法。你只需要創建枚舉

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

    // etc. 
} 

和更新模型視圖CompanyCountview

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

companyCountByMonth()功能:

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() 
     }; 
    } 
} 

的最後一個音符是關於getAllCompanies()功能。如果僅爲此特定視圖創建此函數,則在將所有內容加載到內存之前,我會考慮在查詢上執行group by。但在這種情況下,我的解決方案將不得不調整:)我只希望你能夠簡化它的方法。

相關問題