我有一个旧的MySQL表,我使用Pomelo将其与Entity Framework Core(2.2)一起使用。 我必须创建一个SQL视图,以列出所有使用discriminator列模拟继承的用户。
所以我有多个类映射到一个SQL View。基类是ViewUser
,继承的类是ViewUserCollaborator
,ViewUserClient
,...
EF核心配置:
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上加入),但是我还有其他方法可以做到这一点。
我的主要问题是通过一个查询让所有具有继承性的用户。
感谢您的帮助!