2016-10-10 12 views
1

У меня возникла проблема с использованием прогноза AutoMapper (версия 5.1.1) в сочетании с выражением свойства Linq OrderBy Child. Я использую Entity Framework Core (версия 1.0.0). Я получаю следующее сообщение об ошибке:Прогнозирование Automapper с Linq Ошибка ошибки дочернего элемента OrderBy

"must be reducible node"

Моих объектов DTO являются следующими

public class OrganizationViewModel 
    { 
     public virtual int Id { get; set; } 
     [Display(Name = "Organization Name")] 
     public virtual string Name { get; set; } 
     public virtual bool Active { get; set; } 
     public virtual int OrganizationGroupId { get; set; } 
     public virtual string OrganizationGroupName { get; set; } 
     public virtual int StrategyId { get; set; } 
     public virtual string StrategyName { get; set; } 
     public virtual OrganizationGroupViewModel OrganizationGroup { get; set; } 
    } 

public class OrganizationGroupViewModel 
    { 
     public virtual int Id { get; set; } 
     [Display(Name = "Organization Group Name")] 
     public virtual string Name { get; set; } 
     public virtual bool Active { get; set; } 
    } 

Моих соответствующими моделей сущностей следующим образом:

public class Organization 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string TimeZone { get; set; } 
     public bool Active { get; set; } 
     //FKs 
     public int OrganizationGroupId { get; set; } 
     public int StrategyId { get; set; } 
     //Navigation 
     public virtual OrganizationGroup OrganizationGroup { get; set; } 
     public virtual Strategy Strategy { get; set; } 
     [JsonIgnore] 
     public virtual List<AppointmentReminder> AppointmentReminders { get; set; } 
    } 

public class OrganizationGroup 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public bool Active { get; set; } 

     public virtual List<Organization> Organizations { get; set; } 
    } 

Моими профилей AutoMapper следующим образом:

public class OrganizationMapperProfile : Profile 
    { 
     public OrganizationMapperProfile() 
     { 
      CreateMap<Task<Organization>, Task<OrganizationViewModel>>(); 
      CreateMap<Organization, OrganizationViewModel>() 
       .ForMember(dest => dest.OrganizationGroupName, opt => opt.MapFrom(src => src.OrganizationGroup.Name)); 
      CreateMap<OrganizationInput, Organization>() 
       .ForMember(x => x.Id, opt => opt.Ignore()); 
     } 
    } 

public class OrganizationGroupMapperProfile : Profile 
    { 
     public OrganizationGroupMapperProfile() 
     { 
      CreateMap<Task<OrganizationGroup>, Task<OrganizationGroupViewModel>>(); 
      CreateMap<OrganizationGroup, OrganizationGroupViewModel>(); 
      CreateMap<OrganizationGroupInput, OrganizationGroup>() 
       .ForMember(x => x.Id, opt => opt.Ignore()); 
     } 
    } 

Когда я бегу следующие заявления я могу работать и получать результаты от первых 2 заявления:

var tmp = await _context.Organizations.Include(x => x.OrganizationGroup).OrderBy(x => x.OrganizationGroup.Name).ToListAsync(); 
var tmp4 = await _context.Organizations.Include(x => x.OrganizationGroup).OrderBy("OrganizationGroup.Name").ToListAsync(); 

Но когда я добавляю ProjectTo я получаю ошибку, перечисленные выше:

var tmp5 = await _context.Organizations.Include(x => x.OrganizationGroup).OrderBy(x => x.OrganizationGroup.Name).ProjectTo<OrganizationViewModel>().ToListAsync(); 
var tmp6 = await _context.Organizations.Include(x => x.OrganizationGroup).OrderBy("OrganizationGroup.Name").ProjectTo<OrganizationViewModel>().ToListAsync(); 

В некоторых дополнительная информация, я могу OrderBy с проекциями, работающих на свойствах родительского класса, такие как:

var tmp7 = await _context.Organizations.Include(x => x.OrganizationGroup).OrderBy(x => x.Name).ProjectTo<OrganizationViewModel>().ToListAsync(); 
var tmp8 = await _context.Organizations.Include(x => x.OrganizationGroup).OrderBy("Name").ProjectTo<OrganizationViewModel>().ToListAsync(); 

Любых столкнуться с этой проблемой раньше? Похоже, я пытаюсь сделать что-то, что иначе не поддерживается, так это по дизайну? Спасибо за любую помощь/понимание.

ответ

4

Похоже, проблема вызвана OrganizationGroup свойством OrganizationViewModel класса - AutoMapper генерирует проверку нулевой который EF ядро ​​не нравится в сочетании с вашим OrderBy (я предполагаю, что только одна из многих ошибок в настоящее время в EF Ядра). Он может быть легко воспроизведен с помощью следующего простого ручного проекционного запроса:

var tmp5a = _context.Organizations 
    .OrderBy(x => x.OrganizationGroup.Name) 
    .Select(e => new OrganizationViewModel 
    { 
     Id = e.Id, 
     OrganizationGroup = e.OrganizationGroup != null ? new OrganizationGroupViewModel 
     { 
      Id = e.OrganizationGroup.Id, 
      Name = e.OrganizationGroup.Name, 
      Active = e.OrganizationGroup.Active, 
     } : null, 
    }) 
    .ToList(); 

Чтобы устранить эту проблему, настройте AutoMapper не создавать null проверки этого свойства следующим образом:

CreateMap<Organization, OrganizationViewModel>() 
    .ForMember(dest => dest.OrganizationGroup, opt => opt.AllowNull()) 
    .ForMember(dest => dest.OrganizationGroupName, opt => opt.MapFrom(src => src.OrganizationGroup.Name)); 
+0

Работает отлично. Огромное спасибо! – mcbowes

+1

В случае, если это помогает кому-то другому, я переключился на текущую конструкцию dev на myget, и это, похоже, было рассмотрено. – mcbowes

+0

Похоже, что исправление не дошло до версии 2.0.0-preview1 - https://github.com/aspnet/EntityFramework/issues/6921 – DanO