Как объявить переменную для хранения результата GroupBy() сделанного в EF Core вне текущего класса?

150
14 апреля 2021, 08:50

EF Core - есть выборка из базы:

var transactions = _context.Transactions
    .Include(s=>s.Buyer)
    /*...*/
    .Select(s=>new
    {
        TransactionId = s.Id,
        BuyerName = s.Buyer.Name,
        /*...*/
    })
    .ToListAsync();

Далее мне надо расфасовать полученные данные по различным группам, а потом каждую подгруппу еще на какие-то группы и т.д. (в итоге получается такой себе граф). Так вот, я делаю первую группировку для корневого списка:

// Для примера возьмем корневой категорией - Тип транзакции
// В дальнейшем он может быть произвольным
var groupedTransactions = transactions.GroupBy(s => s.TransactionType);
foreach (var group in groupedTransactions )
{
    var newGroup = new GroupReportCategoryDto();
    newGroup.Id = 1;
    newGroup.Count = group.Count();
    newGroup.TransactionsGroupedByCategory = group;
    newReport.Categories.Add(newGroup);
}

newReport - это DTO класс с массивом корневых элементов:

public class GroupReportDto
{
    public ICollection<GroupReportCategoryDto> Categories { get; set; }
}

, а GroupReportCategoryDto:

public class GroupReportCategoryDto
{
    public int Id { get; set; }
    public int Count { get; set; }
    public ICollection<GroupReportCategoryDto> SubCategories { get; set; }
    // Тут я решил хранить сгруппированные транзакции для текущей
    // категории, чтоб в последствии из них делать следующие подгруппы
    public IGrouping<string, dynamic> TransactionsGroupedByCategory { get; set; }
    public void SetSubCategories(int categoryId)
    {
        // Опустил тут switch/case по передаваемому типу,
        // потом, скорее всего, буду Expression передавать.
        // Вот тут проблема, пишет, что:
        // RuntimeBinderException: 'object' does not contain a definition for 'Sex'
        var groupedStudies = TransactionsGroupedByCategory.GroupBy(s => s.Sex);
        foreach (var group in groupedTransactions)
        {
                var newGroup = new GroupReportCategoryDto();
                newGroup.Id = 6;
                newGroup.Count = group.Count();
                SubCategories.Add(newGroup);
        }
    }
}

вопрос, как объявить TransactionsGroupedByCategory в GroupReportCategoryDto, чтоб он видел нужные свойства? Причем, в брейкпоинтах смотрю - всё норм, типы совпадают.

READ ALSO
начал учить С# и задался вопрос где лучше? [дубликат]

начал учить С# и задался вопрос где лучше? [дубликат]

Всем привет,вот буквально 2-3 дня назад сел за изучение С# и появился встречный вопрос: где учить его? В книгах,либо в видео? Если в книгах,то...

78
Login failed при попытке получить данные из БД в ASP.NET Core

Login failed при попытке получить данные из БД в ASP.NET Core

Согласно этому руководству, пытаюсь создать и инициализировать базу данныхНасколько я понимаю, при использовании EntityFramework в ASP

101
Библиотека для работы с большими числами c#

Библиотека для работы с большими числами c#

Я очень сильно хочу сделать свою библиотеку для работы с большими числамиЯ начал ее делать

109
Cannot insert explicit value for identity column in table &#39;Devices&#39; when IDENTITY_INSERT is set to OFF – ASP.NET Core

Cannot insert explicit value for identity column in table 'Devices' when IDENTITY_INSERT is set to OFF – ASP.NET Core

Сразу внесу ясность: добавление строки contextDatabase

108