Я работаю над решением с Entity Framework Core
и AutoMapper
(версия 9). Сопоставление классов моей сущности с DTO выполняется с помощью проекций.
var dto = await context.Companies
.ProjectTo<MyDto>(config, new { departmentName = "Sales" });
В сопоставлении я выбираю определенный отдел.
public class MyProfile : Profile
{
public MyProfile()
{
string departmentName = null;
CreateMap<Company, MyDto>()
.ForMember(m => m.DepartmentLocation, opt => opt.MapFrom(src =>
src.Divisions.SelectMany(dv =>
dv.Departments.Where(d => d.Name == departmentName)
)
.Single().Location));
}
}
Можно ли переместить код для выбора отдела другого (частного) метода в классе профиля?
Этот код также понадобится при отображении других членов DTO.
Я пытался переместить код в другой метод, но затем собрание компании в Департаменте не заселен. Возможно, потому что EF не может перевести метод на SQL. Я также попытался переписать метод в выражение Fun c, которое возвращает отдел, но затем я не могу использовать результат напрямую для доступа к свойствам отдела в отображении.
public class MyProfile : Profile
{
public MyProfile()
{
string departmentName = null;
CreateMap<Company, MyDto>()
.ForMember(m => m.DepartmentLocation, opt => opt.MapFrom(src =>
SelectDepartment(src, departmentName).Location)
);
}
private Department SelectDepartment(Company company, string departmentName)
{
var department = company.Divisions
.SelectMany(Departments.Where(d => d.Name == departmentName)
.First();
if (department == null)
throw new AutoMapperMappingException($"Department '{departmentName}' not found!");
return department;
}
}
Любые предложения