Linq Join, группировка по нескольким полям - PullRequest
0 голосов
/ 05 августа 2020

У меня есть две таблицы:

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

    [DataType(DataType.Currency), Column(TypeName = "decimal(18,2)")]
    public decimal Balance { get; set; }

    [Display(Name ="Time Registered")]
    public DateTime TimeRegistered { get; set; }

    [InverseProperty("Beneficiary")]
    public ICollection<WalletTransaction> TransactionsReceived { get; set; }

    [InverseProperty("Sender")]
    public ICollection<WalletTransaction> TransactionsInitiated { get; set; }
}

и

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

    public TransactionType TrasactionType { get; set; }

    public decimal Amount { get; set; }

    public string SenderId { get; set; }

    public string ReceipientId { get; set; }

    [ForeignKey("SenderId")]
    public Customer Sender { get; set; }

    [ForeignKey("ReceipientId")]
    public Customer Beneficiary { get; set; }
}

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

public enum TransactionType
{
    Deposit=1,Transfer=2,Withdrawal=3
}

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

Name of CustomerA
    Deposit=Sum of the amount value in all his transactions of transaction type Deposit
    Transfer=Sum of the amount value in all his transactions of transaction type Transfer
    Withdrawal=Sum of the amount value in all his transactions of transaction type Withdrawal
Name of CustomerB
    Deposit=Sum of the amount value in all his transactions of transaction type Deposit
    Transfer=Sum of the amount value in all his transactions of transaction type Transfer
    Withdrawal=Sum of the amount value in all his transactions of transaction type Withdrawal
Name of CustomerC
    Deposit=Sum of the amount value in all his transactions of transaction type Deposit
    Transfer=Sum of the amount value in all his transactions of transaction type Transfer
    Withdrawal=Sum of the amount value in all his transactions of transaction type Withdrawal
etc.

Я не понимаю, как этого добиться. Я думаю, что мне нужно создать запрос linq для присоединения к таблице клиентов и таблица транзакций, чтобы получить имя клиента из таблицы клиентов. Затем сгруппируйте транзакции по клиенту, а также по типу транзакции. Я не уверен, правильно это или нет, но даже если это так, я не знаю, go об этом.

Я пытался сделать это

var customerTransactions = await _context.Customers
            .Include(c => c.TransactionsInitiated)
            .Select(a => new
            {
                //Looking for how to break down he transactions by the transaction types here
            })
            .OrderByDescending(s=>s.TotalAmount)//Not sure too how to order the result
            .ToListAsync();

Пожалуйста, помогите мне о том, как их решить. Спасибо

1 Ответ

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

Поскольку у вас есть свойства навигации, вам не нужно Join в операторах LINQ. В основном то, что вы хотите, можно сделать в запросе типа

_context.Customers
.Select(a => new
{
    c.Name,
    Deposit = c.TransactionsInitiated
        .Where(t => t.TransactionType == TransactionType.Deposit).Sum(t => t.Amount),
    Transfer = c.TransactionsInitiated
        .Where(t => t.TransactionType == TransactionType.Transfer).Sum(t => t.Amount),
    Withdrawal = c.TransactionsInitiated
        .Where(t => t.TransactionType == TransactionType.Withdrawal).Sum(t => t.Amount),
    TotalAmount = c.TransactionsInitiated
        .Sum(t => t.Amount),
})
.OrderByDescending(s => s.TotalAmount)

... и EF присоединится к сгенерированному оператору SQL.

Отказ от ответственности: ядро ​​EF 3 довольно ограничено в переводя более сложные запросы в SQL, я не уверен, что это действительно сработает, и у меня нет под рукой аналогичного тестового примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...