2014-01-31 4 views
0

У меня есть список с этой структурой:Вычислить сумму колонки, используя группу, в Linq

public class Factor 
    { 
     public DateTime? date { set; get; } 
     public string InnovoiceId { set; get; } 
     public string explain { set; get; } 
     public string tax { set; get; } 
     public string transport { set; get; } 
     public Int64? bedehkar { set; get; } 
     public Int64? bestankar { set; get; } 
     public Int64? mande { set; get; } 
    } 

     List<Factor> factors = new List<Factor>(); 

Я создал запрос, который группирует запись, основываясь на InnovoiceId й рассчитать сумму налога и сумма транспорт и bedehkar и bestankar и mande.

Мой запрос:

List<Factor> factorSortList = 
      factors.OrderBy(o => o.date) 
        .ToList() 
        .GroupBy(i => i.InnovoiceId) 
        .Select(g => new { tax = g.Sum(i => Convert.ToInt32(i.tax)), transport = g.Sum(i => Convert.ToInt32(i.transport)), bedehkar = g.Sum(i => i.bedehkar), bestankar = g.Sum(i => i.bestankar), mande = g.Sum(i => i.mande) }); 

Но я получил эту ошибку:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<AnonymousType#1>' to 'System.Collections.Generic.List<samtaApplication.BuLayer.Payment.ReportPayment.Factor>'. An explicit conversion exists (are you missing a cast?) 
+0

Я не хочу использовать ** var ** .i необходимо вернуть Тип фактора – SSC

ответ

0

Вы создаете анонимный тип

.Select(g => new { ... }); 

и делая вид, что это Factor

List<Factor> factorSortList = ... 

Вы должны будете использовать var, так как это анонимный тип или создать другой тип в том, что выберите оператор.

Ниже один из способов решить эту проблему, а также тот факт, что 2 из ваших Sum переменных string и не числовой (при условии int, но то, что вы можете желать здесь вместо этого double.

var factorSortList = 
     factors.OrderBy(o => o.date) 
       .ToList() 
       .GroupBy(i => i.InnovoiceId) 
       .Select(g => new { tax = g.Sum(i => Convert.ToInt32(i.tax)), transport = g.Sum(i => Convert.ToInt32(i.transport)), bedehkar = g.Sum(i => i.bedehkar), bestankar = g.Sum(i => i.bestankar), mande = g.Sum(i => i.mande) }); 

Или если ваш агрегированный тип здесь предназначается, чтобы быть Factor ...

   .Select(g => new Factor() { tax = g.Sum(i => Convert.ToInt32(i.tax)).ToString(), transport = g.Sum(i => Convert.ToInt32(i.transport)).ToString(), bedehkar = g.Sum(i => i.bedehkar), bestankar = g.Sum(i => i.bestankar), mande = g.Sum(i => i.mande) }).ToList(); 
+0

я изменил к нему: Список factorSortList = factors.OrderBy (о => o.date) .ToList() .GroupBy (я => i.InnovoiceId) . Выберите (g => новый фактор() { налог = g.Sum (i => Convert.ToInt32 (i.tax)). ToString(), transport = g.Sum (i => Convert.ToInt32 (i.transport)) ToString(), bedehkar = g.Sum (i => i.bedehkar), bestankar = g.Sum (i => i.bestankar), mande = g.Sum (i = > i.mande) }); – SSC

+0

но я получаю ту же ошибку – SSC

+0

Я не хочу использовать var .i необходимо вернуть Тип фактора – SSC

0

Изменить эти заявления:

tax = g.Sum(i => i.tax), transport = g.Sum(i => i.transport), 

к:

tax = g.Sum(i => Convert.ToInt32(i.tax)), transport = g.Sum(i => Convert.ToInt32(i.transport)), 

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

.Select(g => new Factory { .. }); 

Но тогда ваши Sum функции будет возвращать Int, и ваши типов свойств string .Вы должны преобразовать каждый из них, если не нужен List<Factory> так много, то просто использовать неявное определение типа с вар:

var factorSortList = ... 

Вот полный текст заявления, если вы хотите List<Factor>

List<Factor> factorSortList = 
     factors.OrderBy(o => o.date) 
       .ToList() 
       .GroupBy(i => i.InnovoiceId) 
       .Select(g => new Factor() 
         { 
          tax = g.Sum(i => Convert.ToInt32(i.tax)).ToString(), 
          transport = g.Sum(i => Convert.ToInt32(i.transport)).ToString(), 
          bedehkar = g.Sum(i => i.bedehkar), 
          bestankar = g.Sum(i => i.bestankar), 
          mande = g.Sum(i => i.mande) 
         }); 
+0

Последняя ошибка исправлена, но первая остается – SSC

+0

Изменено Невозможно неявно преобразовать тип 'System.Collections.Generic.IEnumerable < AnonymousType # 1> 'to' System.Collections.Generic.List '. Явное преобразование существует (вы пропали без вести бросок?) – SSC

0

Вы создаете анонимный тип с вашим Select заявление, whic h не может быть неявно преобразован в экземпляр Factor.Попробуйте Select ING в новый Factor, как это:

List<Factor> factorSortList = 
      factors.OrderBy(o => o.date) 
        .ToList() 
        .GroupBy(i => i.InnovoiceId) 
        .Select(g => new Factor() 
          { 
           tax = g.Sum(i => Convert.ToInt32(i.tax)), 
           transport = g.Sum(i => Convert.ToInt32(i.transport)), 
           bedehkar = g.Sum(i => i.bedehkar), 
           bestankar = g.Sum(i => i.bestankar), 
           mande = g.Sum(i => i.mande) 
          }); 

Хотя с Factor.tax и Factor.transport являются string s, вы хотите добавить .ToString() к результату .Sum для тех.

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