2017-03-24 2 views
0

Wanted Hilfe mit dem Code. Ich möchte meine Daten auf einem Balkendiagramm zeigen, das ich tun kann, aber ich wollte es professioneller und mit der Gruppe von Linq tun, aber ich war nicht in der Lage, dies zu tun. Ich verwende die Vorlage "Genetella Admin Layout" für Grafiken. Mein Code in dem Controller-Abschnitt ist als untenAnzeigen von Daten in Balkendiagramm mit Linq und 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(); 
     } 

In diesen i die Monatsnamen von Erstellungsdatum immer bin, die in Datetimeformat in „mth“ gespeichert ist und der Absonderungs es die Zählung für immer.

Mein cs-Dateicode ist wie folgt für 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; 
     } 

dies mit i der folgenden Balkendiagramm am Erzeugen enter image description here

Kann jemand mir helfen, besser diesen Code und wie Linq-Abfrage zu schreiben, so dass ich CreatedDate bekommen (es in Datetime gespeichert ist) in orderby mit nur einem Monat.

Vielen Dank.

Antwort

0

Ich kann mir mehrere verschiedene Lösungen vorstellen, aber Sie können Folgendes versuchen. Ich weiß nicht, ob Sie die getAllCompanies() Methode an mehr Orten verwenden, aber ich würde annehmen, dass es der Fall ist, also werde ich diese Methode nicht ändern. Sie können eine andere Methode in der Business-Schicht hinzuzufügen, die wie folgt aussehen würde:

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

Die CompanyCountView Klasse ist eine neue Ansicht Modell ich die Dinge ordentlich zu halten geschaffen:

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

im Controller, Sie Ruf einfach diese Funktion an. Ich empfehle, Ansichtsmodelle in Ansichten zu verwenden und die Verwendung von ViewData auf Minimum zu beschränken. Es ist besser für die Wartung.

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

Und in der Ansicht, wo Sie die 3-Buchstaben-Abkürzung anzeigen müssen. Verwenden Sie einfach diese:

Ich bin mir nicht sicher, wie Sie mit Jahren umgehen. Wenn das Diagramm Monate innerhalb eines Jahres oder Monaten von allen Einträgen anzeigen soll - irgendeine Art von Statistik. Wenn es nur aus einem bestimmten Jahr stammt, ersetzen Sie einfach meinen fest codierten Wert "2016" durch das Jahr, das Sie benötigen.

Wenn es der andere Fall ist und Sie keine Instanz des DateTime-Typs erstellen möchten, nur um einen Monat zu speichern, oder Sie müssen die Lokalisierung berücksichtigen. Dann können Sie einen etwas anderen Ansatz verwenden. Sie müssen nur Aufzählung

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

    // etc. 
} 

erstellen und aktualisieren, um die Modellansicht CompanyCountview:

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

und die companyCountByMonth() Funktion:

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

Der letzte Ton ist über die getAllCompanies() Funktion. Wenn diese Funktion nur für diese bestimmte Ansicht erstellt wurde, würde ich in Betracht ziehen, group by für die Abfrage auszuführen, bevor Sie alles in den Speicher laden.Aber in diesem Fall müsste meine Lösung angepasst werden :) Ich hoffe nur, Sie bekommen einen Grund, wie es vereinfacht werden kann.