у меня есть довольно основной Entity Framework объект, который выглядит следующим образом:избежать OUTER APPLY в Entity Framework проекциях
public class Student
{
public string Given { get; set; }
public string Surname { get; set; }
public ICollection<Address> Addresses { get; set; }
}
Я хотел бы использовать AutoMapper для отображения этого объекта к соответствующему плоской ViewModel, который выглядит следующим образом :
public class StudentViewModel
{
public string Given { get; set; }
public string Surname { get; set; }
public string PhysicalAddressStreet { get; set; }
public string PhysicalAddressCity { get; set; }
public string PhysicalAddressState { get; set; }
public string PostalAddressStreet { get; set; }
public string PostalAddressCity { get; set; }
public string PostalAddressState { get; set; }
}
Для этого я попробовал следующую конфигурацию отображения:
CreateMap<Student, StudentViewModel>()
.ForMember(dest => dest.Given, opt => opt.MapFrom(src => src.Given))
.ForMember(dest => dest.Surname, opt => opt.MapFrom(src => src.Surname))
.ForMember(dest => dest.PhysicalAddressStreet, opt => opt.MapFrom(src => src.Addresses.FirstOrDefault(add => add.Type == AddressType.Physical).Street))
.ForMember(dest => dest.PhysicalAddressCity, opt => opt.MapFrom(src => src.Addresses.FirstOrDefault(add => add.Type == AddressType.Physical).City))
.ForMember(dest => dest.PhysicalAddressState, opt => opt.MapFrom(src => src.Addresses.FirstOrDefault(add => add.Type == AddressType.Physical).State))
.ForMember(dest => dest.PostalAddressStreet, opt => opt.MapFrom(src => src.Addresses.FirstOrDefault(add => add.Type == AddressType.Postal).Street))
.ForMember(dest => dest.PostalAddressCity, opt => opt.MapFrom(src => src.Addresses.FirstOrDefault(add => add.Type == AddressType.Postal).City))
.ForMember(dest => dest.PostalAddressState, opt => opt.MapFrom(src => src.Addresses.FirstOrDefault(add => add.Type == AddressType.Postal).State));
Проблема заключается в том, когда я запускаю это отображение с помощью проекции:
studentDbSet.Where(st => st.Id == studentId)
.ProjectTo<TProjection>(_mapper.ConfigurationProvider);
Я получаю следующее сообщение об ошибке:
Dynamic SQL Error SQL error code = -104 Token unknown - line 14, column 2 OUTER
Это Firebird ошибка, это, кажется, что при составлении Linq для SQL запроса который генерируется, включает OUTER APPLY
, который не поддерживается в Firebird.
Есть ли способ переделать мою проекцию, чтобы избежать OUTER APPLY
?
Насколько мне известно, OUTER APPLY
генерируется по вызову FirstOrDefault()
. Есть ли другой способ написать Linq, чтобы избежать его использования?
Редактировать для разъяснения: Это ситуация, когда я не в состоянии изменить сущность или схему базы данных, поэтому предположим, что они неприкосновенны.
Моя догадка что вы должны полностью загрузить свои адреса в коллекцию, используя .Include() или проецируя его в коллекцию адресов и только после этой карты в свои свойства PhysicalAddress/PostalAddress. –
@radderick спасибо, вот чего я надеялся избежать, но я боюсь, что вы можете быть правы ... –
Боюсь, вы можете загружать только адреса отдельно. Нет ли лучшего поставщика запросов Firebird? –