具有继承和Automapper映射的EF Core:如何查询和映射具有继承的SQL视图

时间:2019-06-24 07:46:21

标签: c# entity-framework-core automapper

我有一个旧的MySQL表,我使用Pomelo将其与Entity Framework Core(2.2)一起使用。 我必须创建一个SQL视图,以列出所有使用discriminator列模拟继承的用户。

所以我有多个类映射到一个SQL View。基类是ViewUser,继承的类是ViewUserCollaboratorViewUserClient,... 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,继承的类是CollaboratorClient,...

我有一些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上加入),但是我还有其他方法可以做到这一点。

我的主要问题是通过一个查询让所有具有继承性的用户。

感谢您的帮助!

0 个答案:

没有答案