AutoMapper: количество дочерних объектов - PullRequest
0 голосов
/ 09 января 2019

Я хочу преобразовать данные трех таблиц в плоскую модель представления с помощью AutoMapper.

Поскольку я не мог понять, как настроить необходимую конфигурацию AutoMapper, я ценю любую информацию о том, как решить эту проблему.

public class Category {
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public virtual ICollection<BankingAccountCategory> BankingAccountCategories { get; set; }
}

public class BankingAccountCategory {
    public int Id { get; set; }
    public int BankingAccountId { get; set; }
    public int CategoryId { get; set; }
    public virtual BankingAccount BankingAccount { get; set; }
    public virtual Category Category { get; set; }
    public virtual ICollection<Expense> Expenses { get; set; }
}

public class Expense {
    public int Id { get; set; }
    public int BankingAccountCategoryId { get; set; }
    public DateTime Date { get; set; }
    public decimal Amount { get; set; }
    public virtual BankingAccountCategory BankingAccountCategory { get; set; }
}

Моя модель просмотра:

public class CategoryViewModel {
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public int NumberOfExpenses { get; set; }
}

На стороне sql этот запрос предоставляет результат, который я хочу получить:

select cat.Id, cat.Title, cat.Description, count(ex.Id) as ExpenseCount from Category cat
  inner join BankingAccountCategory bac on bac.CategoryId = cat.Id                 
  left outer join Expense ex on ex.BankingAccountCategoryId = bac.Id
  group by cat.Id, cat.Title, cat.Description

Моя конфигурация автомаппера:

CreateMap<Category, CategoryViewModel>()
    .ForMember(dest => dest.NumberOfExpenses, opt => opt.MapFrom(cat =>
        cat => BankingAccountCategory.Select(bac => bac.Expenses)));

Проблема в том, что NumberOfExpenses всегда равно 0 для всех записей.

1 Ответ

0 голосов
/ 09 января 2019

Ваша исходная конфигурация вернула бы IEnumerable<ICollection<Expense>>, а не int, как требуется.

Попробуйте вместо этого:

CreateMap<Category, CategoryViewModel>()
    .ForMember(dest => dest.NumberOfExpenses,
        opt => opt.MapFrom(cat => BankingAccountCategories.Sum(bac => bac.Expenses.Count())));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...