2016-04-06 14 views
0

ich diese Linq Fragen haben, wenn ich diese Abfragen laufen i das Ergebnis bekam, die ich unter, wie die Liste in Linq Abfrage fusionieren

var SalesinvDets = (from si in CustomerTransactions 
          where si.TransTypeID == 10 
          group new {si} by new{ 
     month=si.Period==1?"Jan-2015":si.Period==2?"Feb-2015":si.Period==3?"Mar-2015":si.Period==4?"Apr-2015":si.Period==5?"May-2015": 
           si.Period==6?"Jun-2015":si.Period==7?"Jul-2015":si.Period==8?"Aug-2015":si.Period==9?"Sep-2015":si.Period==10?"Oct-2015": 
           si.Period==11?"Nov-2015":si.Period==12?"Dec-2015":"", 
     month2=si.Period==13?"Jan-2016":si.Period==14?"Feb-2016":si.Period==15?"Mar-2016":si.Period==16?"Apr-2016":si.Period==17?"May-2016": 
           si.Period==18?"Jun-2016":si.Period==19?"Jul-2016":si.Period==20?"Aug-2016":si.Period==21?"Sep-2016": 
           si.Period==22?"Oct-2016":si.Period==23?"Nov-2016":si.Period==24?"Dec-2016":"", 
          period=si.Period 
          } into g  
          select new 
          {  
           month=g.Key.month, 
           month2=g.Key.month2, 
           Amount = g.Sum(x=>x.si.OVAmount)//.Sum(x=>x.si.OVAmount-(x.si.OVDiscount+x.si.OVFreight))//(si.OVAmount - (si.OVDiscount + si.OVFreight)) 
          }).Dump(); 

ich während führen Sie die Abfrage dieses Ergebnis bekam in img gezeigt, aber ich brauche nicht, wie die

Linq Error

ich das Ergebnis so benötigen, pls helfen, meine Aufgabe zu erreichen

result img

+0

Das groupby funktioniert nicht so, wie Sie wollen. Ich würde der Klasse IComparable mit der Methode CompareTo() eine Vererbung hinzufügen. Die Linq Groupby verwendet die CompareTo-Methode für die Gruppierungen. Sie haben eine komplizierte GroupBy und es ist viel einfacher, als eine Funktion zu codieren. Sie können auch eine Hilfsfunktion für die Gruppierung erstellen, die der CompareTo() -Methode entspricht, die eine ganze Zahl (-1, 0,1) zurückgibt. – jdweng

Antwort

2

Ausgabe existieren aufgrund fehlerhafter GroupBy Aussage, es auf den Wert der si.Period basiert, die einer der Werte in month und month2 angegeben werden, also in jeder entweder month oder month2 Gruppierung empty string "" sein wird, werden beide nie sein gefüllt, so das Ergebnis, dass Sie gezeigt haben, Lösung für die gleiche getrennte Gruppierung auf month und month2 basieren würde, wie folgt:

var SalesinvDetsMonthList = (from si in CustomerTransactions 
          where si.TransTypeID == 10 
          group new {si} by new{ 
     month=si.Period==1?"Jan-2015":si.Period==2?"Feb-2015":si.Period==3?"Mar-2015":si.Period==4?"Apr-2015":si.Period==5?"May-2015": 
           si.Period==6?"Jun-2015":si.Period==7?"Jul-2015":si.Period==8?"Aug-2015":si.Period==9?"Sep-2015":si.Period==10?"Oct-2015": 
           si.Period==11?"Nov-2015":si.Period==12?"Dec-2015":"", 

          period=si.Period 
          } into g  
          select new 
          {  
           Month=g.Key.month 
           Amount = g.Sum(x=>x.si.OVAmount)//.Sum(x=>x.si.OVAmount-(x.si.OVDiscount+x.si.OVFreight)) 
          }).Where(x => x.month != "").ToList(); // Removing empty month values/default values 


var SalesinvDetsMonth2List = (from si in CustomerTransactions 
          where si.TransTypeID == 10 
          group new {si} by new{ 
     month2=si.Period==13?"Jan-2016":si.Period==14?"Feb-2016":si.Period==15?"Mar-2016":si.Period==16?"Apr-2016":si.Period==17?"May-2016": 
           si.Period==18?"Jun-2016":si.Period==19?"Jul-2016":si.Period==20?"Aug-2016":si.Period==21?"Sep-2016": 
           si.Period==22?"Oct-2016":si.Period==23?"Nov-2016":si.Period==24?"Dec-2016":"", 
          period=si.Period 
          } into g  
          select new 
          {  
           month=g.Key.month, 
           Month2=g.Key.month2, 
           Amount2 = g.Sum(x=>x.si.OVAmount)//.Sum(x=>x.si.OVAmount-(x.si.OVDiscount+x.si.OVFreight))//(si.OVAmount - (si.OVDiscount + si.OVFreight)) 
          }).Where(x => x.month != "").ToList(); // Removing empty month values/default values 

Jetzt müssen wir weiter oben erstellt haben die beiden Listen zusammen:

SalesinvDetsMonthList, SalesinvDetsMonth2List 

Für welche ich nehme an, sie haben gleiche Anzahl von Datensätzen ,, Sie jetzt eine neue Einheit benötigen wie:

public class SalesinvDetsMonthCombined 
{ 
    public string Month {get; set;} 
    public string Month2 {get; set;} 
    public int Amount {get; set;} 
    public int Amount2 {get; set;} 
} 

int totalCount = SalesinvDetsMonthList.Count; 

List<SalesinvDetsMonthCombined> result = new List<SalesinvDetsMonthCombined>(); 

for (int index=0, index < totalCount; index ++) 
{ 
    result.Add(new SalesinvDetsMonthCombined 
       (Month = SalesinvDetsMonthList[index].Month, 
        Month2 = SalesinvDetsMonth2List[index].Month2, 
        Amount = SalesinvDetsMonthList[index].Amount, 
        Amount2 = SalesinvDetsMonth2List[index].Amount2 
       )); 
} 

Bitte beachten Sie jedoch, über Code auf der Annahme basiert, die Sie zur Verfügung gestellt haben, dass es sind übereinstimmende Datensätze, falls Diskrepanzen in der Anzahl der Datensätze bestehen, dann müssen Sie einen Standard hinzufügen, sonst wird es fehlschlagen

+0

int totalCount = SalesinvDetsMonth.Count; Liste Ergebnis = neue Liste (); for (int index = 0, index

+0

Was ist der Fehler, Index außerhalb des Bereichs? wie ich vorgeschlagen habe Erfolg der Lösung hängt von der Tatsache, dass beide Liste die gleiche Anzahl von Datensätzen haben, sonst benötigen Sie einen Standard, auch eine geringfügige Bearbeitung des Codes, überprüfen Sie das? –