Я написал 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
.