Возвращаемый объект после фильтрации и группировки

Вкратце, чтобы было понимание, опишу процесс того что тут происходит: Есть базовый 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();
}

Я не совсем понимаю правильно ли я возвращаю объект, да и выглядит это достаточно коряво. Может ли кто-то подсказать как вернуть объект красиво. Помимо этого, если заметите ошибки в группировке или фильтрации буду вам признателен.


Ответы (0 шт):