Вычислить сумму столбца с помощью groupby

#c# #linq #entity-framework #group-by

#c# #linq #entity-framework #сгруппировать по

Вопрос:

Я пытаюсь рассчитать долг моего клиента, используя groupby

У меня есть 2 таблицы со структурами, которые вы можете видеть здесь :

   public partial class Inovice
    {
        public Inovice()
        {
            this.Payments = new HashSet<Payment>();
            this.InvoiceDetails = new HashSet<InvoiceDetail>();
        }
        public PersianCalendar objPersianCalender = new PersianCalendar();

        [DisplayName("شناسه")]
        public int Id { get; set; }

        [DisplayName("شناسه کاربر")]
        public int MemberId { get; set; }

        public virtual ICollection<InvoiceDetail> InvoiceDetails { get; set; }
    }
  

В этой таблице хранятся счета клиентов, в других таблицах хранятся товары, которые покупают клиенты.структура такая :

  public partial class InvoiceDetail
    {
        [DisplayName("شناسه ")]
        public int Id { get; set; }


        [DisplayName("مقدار")]
        public Nullable<double> Amount { get; set; }   

        [DisplayName("شناسه فاکتور")]
        public int InoviceId { get; set; }
        public Nullable<bool> IsReturned { get; set; }

        public virtual Inovice Inovice { get; set; }
    }
  

Мои значения:

 MemberOrCustomer       sumOfAmountvalues
1                        12
1                        8
2                        12
2                        11
  

Эти две таблицы имеют отношения на invoiceid .Мне нужно суммировать amount(InvoiceDetail) значения для каждого memberId(Invoice) , например :

 MemberOrCustomer       sumOfAmountvalues
1                        20
2                        23
  

Я пишу этот код для этого, но он не работает :

  var result= invoices.GroupBy(i => i.MemberId).Select(group=>new {Amount=group.Sum(Amount)} );
  

С наилучшими пожеланиями

Ответ №1:

Ну, вы могли бы работать со списком деталей invoicesDetails.

 var result = invoicesDetails.GroupBy(id => id.Invoice.MemberId)
                            .Select(g => new {
                                       MemberOrCustomer = g.Key,
                                       Amount = g.Sum(x => x.Amount)
                            });
  

где InvoiceDetails могут быть

 invoices.SelectMany(x => x.InvoiceDetails)
  

итак

 invoices
    .SelectMany(x => x.InvoiceDetails)
    .GroupBy(id => id.Invoice.MemberId)
    .Select(g => new {
               MemberOrCustomer = g.Key,
               Amount = g.Sum(x => x.Amount)
    });
  

Комментарии:

1. что вы подразумеваете под этим кодом invoices. Выберите Many(x => x.InvoiceDetails), должен ли я использовать это?

2. @EA просто в зависимости от того, можете ли вы работать с другим списком, чем invoices (который был бы IEnumerable<InvoiceDetails> или вам нужно работать с invoices , который является IEnumerable<Invoice> . Возможно, см. Редактирование.