Сложный и эффективный запрос LINQ - PullRequest
0 голосов
/ 09 марта 2019

Я написал linq query, чтобы сгенерировать кассовую книгу в разных точках продаж и распределить sort их по date.query занимает слишком много времени для завершения.

Шаг 1. Сначала я написал на сервере sql представление, объединяющее два типа транзакции: расходы и платежи.

select *, 'expense' as TransactionType from  tbl_Expenses
Union
select *, 'payment' as TransactionType from tbl_Payments

Шаг 2:Теперь я написал linq для запроса представления и получения желаемого результата.

    public IList<dto_CashBookList> CashBookReport(DateTime? fromDate, DateTime? toDate, int? locationId)
    {
        try
        {
            List<dto_CashBookList> lstCashBookList = new List<dto_CashBookList>();

            var locations = locationId == 0 ? _context.vw_Cashbook.Where(t => t.TransactionDate >= fromDate && t.TransactionDate <= toDate).DistinctBy(d => d.LocationId).ToList() : _context.vw_Cashbook.Where(t => t.TransactionDate >= fromDate && t.TransactionDate <= toDate && t.LocationId == locationId).DistinctBy(d => d.LocationId).ToList();


            foreach(var location in locations)
            {

                List<dto_CashBook> lstCashBook = new List<dto_CashBook>();

                var transactions = _context.vw_Cashbook.Where(t => t.TransactionDate >= fromDate && t.TransactionDate <= toDate && t.LocationId == location.LocationId).DistinctBy(d => d.TransactionDate.Date).OrderBy(k=>k.TransactionDate).ToList();

                foreach (var transaction in transactions)
                {
                    try
                    {

                        var expense = (from x in _context.vw_Cashbook
                                       where x.TransactionType == "Expense" &&  x.TransactionDate.Year == transaction.TransactionDate.Year && x.TransactionDate.Day == transaction.TransactionDate.Day && x.TransactionDate.Month == transaction.TransactionDate.Month && x.LocationId ==transaction.LocationId
                                       select new dto_Expense()
                                       {
                                           RecieverName = x.Name,
                                           ReferenceNumber = x.ReferenceNumber,
                                           Amount = x.Amount,
                                           TransactionId = x.TransactionId,
                                           PaymentModeId = x.PaymentModeId,
                                           TransactionDate = x.TransactionDate
                                       });


                        var payment = (from x in _context.vw_Cashbook
                                       where x.TransactionType == "Payment" &&  x.TransactionDate.Year == transaction.TransactionDate.Year && x.TransactionDate.Day == transaction.TransactionDate.Day && x.TransactionDate.Month == transaction.TransactionDate.Month && x.LocationId == transaction.LocationId
                                       select new dto_Payment()
                                       {
                                           Amount = x.Amount,
                                           TransactionId = x.TransactionId,
                                           PaymentDate = x.TransactionDate,
                                           Invoice = new dto_Invoice()
                                           {
                                               CustomerName = x.Name,
                                               InvoiceNumber = x.ReferenceNumber,
                                               TransactionId = x.TransactionId
                                           }
                                       });

                        var bf = _financeRepository.GetCashBookBBF(transaction.TransactionDate, transaction.LocationId);
                        var totalExpense = expense.FirstOrDefault()==null? 0 : expense.Sum(x => x.Amount);
                        var totalPayment = payment.FirstOrDefault()==null? 0 : payment.Sum(x => x.Amount);
                        var cb = (bf + totalPayment) - totalExpense;

                        lstCashBook.Add(
                            new dto_CashBook()
                            {
                                BalanceBF = bf,
                                TotalExpense = totalExpense,
                                TotalPayment = totalPayment,
                                BalanceCD = cb,
                                TransactionStartDate = (DateTime)fromDate,
                                TransactionEndDate = (DateTime)toDate,
                                ReportDate = transaction.TransactionDate,
                                Expense = expense.ToList(),
                                Payment = payment.ToList()
                            });
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }




                }

                lstCashBookList.Add(new dto_CashBookList()
                {
                    LocationName =location.LocationName,
                    CashBook = lstCashBook
                });



            }



            return lstCashBookList.ToList();



        }
        catch (Exception ex)
        {
            throw ex;
        }


    }

Я хочу знать, есть ли лучший способ, которым я написал бы этот код.Я бы предпочел добиться этого с помощью stored procedure, чем с linq query.

...