У меня есть старая таблица MySQL, которую я создал с помощью Entity Framework Core (2.2), используя Pomelo.
Мне пришлось создать представление SQL, чтобы вывести список всех пользователей, имитирующих наследование, с помощью столбца дискриминатора.
Итак, у меня есть несколько классов, сопоставленных с одним представлением SQL. Базовый класс - ViewUser
, а унаследованные - ViewUserCollaborator
, ViewUserClient
, ...
Конфигурация EF Core:
public DbQuery<ViewUser> ViewUsers { get; set; }
[...]
modelBuilder.Query<ViewUser>(entity =>
{
entity.ToView("v_users")
.HasDiscriminator<string>("discriminator")
.HasValue<ViewUserClient>("Client")
.HasValue<ViewUserCollaborator>("Collaborator")
.HasValue<ViewUser>("User");
}
Теперь у меня есть хранилище, которое предоставляет доменные сущности с одинаковым наследованием, но разными классами и свойствами. Базовый класс - User
, а унаследованные - Collaborator
, Client
, ...
Я получил несколько конфигураций AutoMapper:
CreateMap<ViewUser, User>()
.Include<ViewUserCollaborator, Collaborator>()
.Include<ViewUserClient, Client>()
.ForMember(e => e.Id, opts => opts.MapFrom(m => m.UserId))
...;
CreateMap<ViewUserClient, Client>()...;
CreateMap<ViewUserCollaborator, Collaborator>()...;
Используя мой репозиторий, я хотел бы опросить всех пользователей, получающих наследование, на основе SQL View.
Я звоню Пользователям и получаю список Пользователей с наследованием; например: Users.OfType () возвращает непустой список.
Я пытался использовать проекцию, но наследство не сохранилось.
return Context.ViewUsers.ProjectTo<User>();
Я пытался отобразить в запросе. Это работает, но производительность действительно низкая, потому что сопоставление выполняется во время запроса, а не во время перечисления.
return from u Context.ViewUsers
select u.Discriminator == "Collaborator" ? Map<Collaborator>(u) :
u.Discriminator == "Client" ? Map<Client>(u) :
Map<User>(u);
Скажите, если я ошибаюсь, но я думаю, что есть только два возможных способа: "проектировать" с наследованием или отображать карту во время перечисления, но я не нашел, как.
И, чтобы добавить некоторую сложность, мне нужно получить другие данные только для определенного типа пользователя (например, присоединиться к UserDepartment, если пользователь является Collaborator), но у меня есть несколько других способов сделать это.
Моя главная проблема - собрать всех пользователей с наследованием одним запросом.
Спасибо за вашу помощь!