2016-04-06 2 views
0

У меня есть это Linq запросы, когда я запустить эти запросы я получил результат, который я показанный в IMG нижеКак объединить список в Linq Query

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

Я получил этот результат во время выполнения запроса, но мне не нужно, как этот

Linq Error

мне нужен результат, как это, пожалуйста помогают достичь МОЯ ЗАДАЧА

result img

+0

Групповой режим работает не так, как вы хотите. Я хотел бы наследовать класс IComparable с помощью метода CompareTo(). Linq Groupby будет использовать метод CompareTo для группировок. У вас сложный GroupBy, и его гораздо проще кодировать как функцию. Вы также можете создать вспомогательную функцию для выполнения группировки, которая эквивалентна методу CompareTo(), который возвращает целое число (-1, 0,1). – jdweng

ответ

2

Проблема существует из-за ошибки GroupBy заявления, оно основано на значении si.Period, который будет представлять собой любой один из значений, указанных в month и month2, поэтому в каждой группировке либо month или month2 будет empty string "", как никогда не будет заполнены, таким образом, результат, который вы показали, решение для того же будет отдельной группировкой, основанной на month и month2 следующим образом:

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 

Теперь нам нужно объединить два списка созданных выше:

SalesinvDetsMonthList, SalesinvDetsMonth2List 

Для которого я предполагаю, что они имеют одинаковое количество записей ,, теперь вам нужен комбинированный объект как:

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

Однако обратите внимание, что выше код основывается на предположении, что вы предоставили, что являются совпадающими записями, в случае несоответствия в количестве записей, тогда вам нужно добавить значение по умолчанию, иначе оно не удастся

+0

int totalCount = SalesinvDetsMonth.Count; Список result = new List (); для (Int индекс = 0, индекс

+0

Что такое ошибка, индекс за пределами диапазона? как я сказал, успех решения зависит от того, что оба списка имеют одинаковое количество записей, иначе вам нужен по умолчанию, а также незначительное редактирование кода, проверьте это? –

Смежные вопросы