Как рассчитать сумму для указанного свойства c без группировки данных основного списка - PullRequest
0 голосов
/ 07 мая 2020

Я получаю счета-фактуры из базы данных и хочу вернуть все счета-фактуры без их группировки!

Я не хочу их группировать, так как если есть 100 счетов-фактур, я хочу вернуть их все 100, учитывая, что я хочу получить сумму суммы.

Так что совершенно нормально повторить одну и ту же общую сумму для нескольких счетов, если их сумма одинакова, поэтому в основном Я хочу рассчитать сумму суммы каждой позиции счета и группы по CompanyId, PackageId, BankId, PayMethod , только если это возможно?

- Прочитать комментарии к коду -

var result = await _dbContext.Invoices
                       .Where(p => p.CheckDate >= startDate && p.CheckDate <= endDate)
                       .Select(p => new DemoDto()
                       {
                           CompanyId = p.CompanyId,
                           Title = p.Title,
                           Price = p.Price
                           Total = p.Sum(p => p.Amount).ToString(), // Can I sum here and group by fields I mentioned above? without grouping all data set because I want to keep all 100 records if I received all 100 from database
                       })
                       .ToListAsync();

Этот запрос совершенно не работает, потому что он говорит:

Счет-фактура не содержат определение Sum и недоступный метод ..

DemoDto выглядит так:

public class DemoDto
{
  public string CompanyId {get;set;}
  public string Title {get;set;}
  public decimal Price {get;set;}
  public decimal Amount {get;set;}
}

Класс Invoice выглядит так:

public class Invoice
{
    public string CompanyId { get; set; }
    public int PackageId {get; set;}
    public int BankId {get;set;}
    public int PayMethod {get;set;}
    public string Title { get; set; }
    public decimal Price { get; set; }
    public decimal Amount { get; set; }
}

what I здесь не хватает?

Как я могу этого добиться?

Спасибо, ребята Ура

1 Ответ

1 голос
/ 07 мая 2020
  1. Получить все счета из базы данных:

    var invoices = await _dbContext.Invoices
                     .Where(p => p.CheckDate >= startDate && p.CheckDate <= endDate)
                     .ToListAsync();
    
  2. Сгруппируйте результаты в памяти с помощью Linq-To-Object:

    var result = invoices?
                     .GroupBy(p => new { p.CompanyId, p.PackageId, p.BankId, p.PayMethod })
                     .SelectMany(x => x.Select(y =>
                         new DemoDto
                         {
                             CompanyId = y.CompanyId,
                             Title = y.Title,
                             Price = y.Price,
                             Total = x.Sum(z => z.Price)
                         }))
                     .ToList();
    

Если вы по какой-то причине хотите выполнить группировку в базе данных, вам следует выполнить необработанный SQL запрос или хранимую процедуру, а не полагаться на ORM для генерации некоторого мага c (и, скорее всего, неэффективный) запрос для вас.

...