Присоединение Linq с помощью GroupBy и Sum - PullRequest
1 голос
/ 05 августа 2020

У меня есть таблица транзакций и таблица клиентов, как показано ниже:

public class Customer
{    
    public string Id{ get; set; }
    public string Name { get; set; }
    public string Password { get; set; }
 }

public class SalesTransaction
{
    public int Id { get; set; }

    public decimal Amount { get; set; }
    public string CustomerId{ get; set; }
}

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

Я пробовал следующий синтаксис метода linq

await _context.SalesTransactions
            .GroupBy(w=>w.CustomerId)
            .OrderByDescending(g=>g.Sum(t=>t.Amount))
            .ToListAsync();

, но когда я пытаюсь запустить его, я получаю следующую ошибку

InvalidOperationException: GroupBy на стороне клиента не поддерживается.

Я также пробовал следующий синтаксис запроса

var TransactionSummary = await (from w in _context.WalletTransactions
                           //join c in _context.Customers 
                            on w.CustomerId equals c.Id
                            group w by w.CustomerId
                            into ct
                            //from c in ct.DefaultIfEmpty()
                            select new
                            {
                             ID=ct.Key,
                             TransactionAmount=ct.Sum(a=>a.Amount),
                            // ct.Name
                             }).ToListAsync();

, но Sum (w.Amount) показывает ошибку, говоря, что " Sum не существует в текущем контексте ".

Я также не уверен, где разместить предложение группировки в синтаксисе запроса, чтобы добиться группировки результата по полю Customer.Id.

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

Я sh, чтобы получить правильный способ go об этом .

Спасибо

РЕШЕНИЕ НАЙДЕНО: Благодаря ответу от @ Asherguru

Мне просто пришлось немного изменить его, чтобы добиться желаемого результата

Работали следующие

var transactions= (await _context.SalesTransactions.Include(x => x.Sender).ToListAsync())
            .GroupBy(w => new { w.CustomerId, w.Sender })
            .Select(x => new 
            {
                CustomerID= x.Key.CustomerId,
                 x.Key.Customer,
                Amount = x.Sum(w => w.Amount)
            }).ToList();

1 Ответ

1 голос
/ 05 августа 2020

Попробуйте это.

await _context.SalesTransactions
        .GroupBy(w => w.CustomerId)
        .Select(x => new SalesTransactions() 
        {
            CustomerId = x.Key,
            Amount = x.Sum(w => w.Amount)
        }).ToListAsync();

enter image description here

enter image description here

EDITED 2

await _context.SalesTransactions.Include(x => x.Customer).ToListAsync()
    .GroupBy(w => new { w.CustomerId, w.Customer })
    .Select(x => new SalesTransactions() 
    {
        CustomerId = x.Key.CustomerId,
        Customer = x.Key.Customer,
        Amount = x.Sum(w => w.Amount)
    }).ToListAsync();

введите описание изображения здесь

Может получить имя из Customer.Name в классе SalesTransaction.

...