Возвращаемый объект после фильтрации и группировки
Вкратце, чтобы было понимание, опишу процесс того что тут происходит: Есть базовый SQL запрос, он джоинит две таблицы и возвращает данные, не применяя НЕОБХОДИМОЙ фильтрации. Затем для этого запроса я создаю 1й фильтр и группирую значения. Аналогичные действия делаю для этого же запроса, только применяю другой фильтр (2й) и так же провожу группировку. Отмечу что группировки в этих двух запросах будут одинаковые.
На выходе метода мне необходимо вернуть объект, где RoomRevenue это результат 1го фильтрп и группировки, OtherRevenue это результат 2го фильтра и группировки. TotalRevenue является их суммой.
Мое решение приведено ниже:
private IEnumerable<NetRevenue> GetNetRevenueSummary<T>(IEnumerable<GroupedRevenues<T>> revenues)
{
var filteredRoomRevenue = revenues.Where(x => x.LedgerAccountType.Equals(LedgerAccountType.RoomCharge)); //filter
IEnumerable<GroupedRevenues<T>> GroupedRoomRevenue = GroupByRevenues<T>(filteredRoomRevenue, LedgerAccountType.RoomCharge); //grouping
var filteredOtherRevenue = revenues.Where(x => x.LedgerAccountType.Equals(LedgerAccountType.Incidental) || x.LedgerAccountType.Equals(LedgerAccountType.Fee)); //.Select(s => s.Amount).FirstOrDefault();
var GroupedOtherRevenue = GroupByRevenues(filteredOtherRevenue, LedgerAccountType.Incidental); //Incidentals = OtherRevenue
var totalRevenue = GroupedRoomRevenue.Select(x => x.Amount).FirstOrDefault() +
GroupedOtherRevenue.Select(x => x.Amount).FirstOrDefault();
return GroupedRoomRevenue.Select(s => new NetRevenue
{
RoomRevenue = s.Amount,
OtherRevenue = GroupedOtherRevenue.Select(s => s.Amount).FirstOrDefault(),
TotalRevenue = totalRevenue
});
}
GroupBy Method
private IEnumerable<GroupedRevenues<T>> GroupByRevenues<T>(IEnumerable<GroupedRevenues<T>> rawData, LedgerAccountType ledgerAccountType)
{
return rawData.GroupBy(g => g.ListValue ).Select(s => new GroupedRevenues<T>
{
GroupByValue = s.Select(s => s.GroupByValue).FirstOrDefault(),
Date = s.Select(s => s.Date).FirstOrDefault(),
LedgerAccountType = ledgerAccountType,
Amount = s.Select(s => s.Amount).FirstOrDefault(),
ListValue = s.Key,
}).ToList();
}
Я не совсем понимаю правильно ли я возвращаю объект, да и выглядит это достаточно коряво. Может ли кто-то подсказать как вернуть объект красиво. Помимо этого, если заметите ошибки в группировке или фильтрации буду вам признателен.