Filtering data after BaseQuery (entity framework)
Всем привет У меня есть некий базовый запрос к базе данных. После получения ответа нужно применить фильтр для LedgerAccountTypeId
Вот мой код с запросом
public IEnumerable<GroupedRoomRevenue> GetGroupedRoomRevenue(ReportRequest reportRequest, DateRange bookingDateRange, NetSalesGroupBy groupBy)
{
var failedTransactionStatus = (int)TransactionStatus.Failed;
var voidTransactionStatus = (int)TransactionStatus.Void;
var baseQuery = _reportsDbContext.Reservations.AsNoTracking()
.Join(_reportsDbContext.LedgerTransactions.AsNoTracking(),
reservation => reservation.ReservationId,
ledgerTransactions => ledgerTransactions.ReservationId,
(reservation, ledgerTransactions) => new { reservation, ledgerTransactions }).
Where(w =>
w.reservation.ClientId == reportRequest.ClientId && //active reservation
w.reservation.PropertyId == reportRequest.PropertyId &&
!_reservationStatus.Contains(w.reservation.StatusId) &&
//w.ledgerTransactions.LedgerAccountTypeId == LedgerAccountType.RoomCharge && //check it
w.ledgerTransactions.DateEffective < bookingDateRange.End || bookingDateRange.End == null &&
w.ledgerTransactions.DateEffective >= bookingDateRange.Start || bookingDateRange.Start == null &&
w.ledgerTransactions.TransactionStatusId != voidTransactionStatus &&
w.ledgerTransactions.TransactionStatusId != failedTransactionStatus &&
w.reservation.StatusId != ReservationStatus.Deleted &&
w.reservation.StatusId != ReservationStatus.Quote &&
w.reservation.StatusId != ReservationStatus.Maintenance &&
w.reservation.StatusId != ReservationStatus.GroupBlocked &&
w.ledgerTransactions.FolioStatusId != FolioStatus.Deleted
);
var roomRevenue = NetSalesAccountType.RoomRevenue;
return baseQuery.Select(s => new GroupedRoomRevenue
{
GroupByValue = groupBy,
Date = s.ledgerTransactions.DateEffective,
NetSalesAccountType = roomRevenue,
Amount = s.ledgerTransactions.Amount
}).ToList();
}
Закомментированная строка это как раз и будет тот фильтр по которому необходимо отфильтровать этот базовый запрос.
w.ledgerTransactions.LedgerAccountTypeId == LedgerAccountType.RoomCharge
Ещё один момент, что на выходе я возвращаю объект, поэтому фильтрацию нужно произвести после выполнения самого метода. То есть смысл в том чтобы произвести запрос к бд, а потом для разных методов применять фильтры к этому базовому запросу. Я пытался сделать вот так, но что-то я не совсем уверен
public Task<IEnumerable<NetRevenue>> GetNetRevenues(ReportRequest reportRequest, NetSalesGroupBy groupBy)
{
var roomRevenue = GetGroupedRoomRevenue(reportRequest, reportRequest.DateRange, groupBy, LedgerAccountType.RoomCharge);
var filteredRoomRevenue = roomRevenue.Where(x => x.LedgerAccountType.Equals(LedgerAccountType.RoomCharge)).
Select(s=>s.Amount).FirstOrDefault();
var otherRevenue = GetGroupedRoomRevenue(reportRequest, reportRequest.DateRange, groupBy, LedgerAccountType.Incidental);
var filteredOtherRevenue = otherRevenue.Where(x => x.LedgerAccountType.Equals(LedgerAccountType.Incidental) ||
x.LedgerAccountType.Equals(LedgerAccountType.Fee)).Select(s=>s.Amount).FirstOrDefault();
//var roomRevenueAmount =
var netRev = new NetRevenue
{
RoomRevenue = filteredRoomRevenue,//filteredRoomRevenue.Select(s => s.Amount),
OtherRevenue = filteredOtherRevenue,//filteredOtherRevenue.Select(s => s.Amount),
TotalRevenue = filteredRoomRevenue + filteredOtherRevenue
};
return netRev;
}