【问题标题】:Ef Core Select inherited ModelEf Core Select 继承模型
【发布时间】:2022-11-17 19:44:46
【问题描述】:

我有以下课程:

public class User{
    public Guid Id{get; set;}
    public string Name {get; set;}
}

public class TestUser : User{
    public string Title {get; set;}
}

public class CustomUser: User{
    public string Value {get; set;}
}

类的配置如下所示:

modelBuilder.Entity<TestUser>().HasBaseType<User>();
modelBuilder.Entity<CustomUser>().HasBaseType<User>();

每个类都是一个单独的数据库表 (TPT)。

每个类都有一个映射要共享的数据的 DTO 类(UserGetDto、TestUserGetDto、CustomUserGetDto)。 Dto-Classes 也是继承的。

public class UserGetDto{}

public class TestUserGetDto : UserGetDto{}

public class CustomUserGetDto : UserGetDto{}

现在我想使用 LINQ 选择 DTO 并返回相应的 DTO。但是 switch-Case 表达式不起作用:

public List<UserGetDto> GetUsers(){
    return _context.Users
        .Select(user => user switch{
            User usr when usr is TestUser => new TestUserGetDto(){
                ...
            },
            User usr when usr is CustomUser => new CustomUserGetDto(){ ... },
            _ => new UserGetDto(){...}
        }
        .ToList();
}

还有其他方法可以选择相应的 DTO 吗?

【问题讨论】:

  • 向我们展示您的模型配置代码 - what inheritance strategy 您正在使用(TPH、TPT、TPCT、TPC 等)吗?
  • 你为什么不能使用automapper?这些逻辑将自动完成。
  • “Dto-Classes 也是继承的。”- 这样做会在以后引起问题。
  • @JyothishBhaskaran 你的意思是不将类映射到 Dtos 中?
  • @JyothishBhaskaran 我查看了 AutoMapper,它看起来非常好而且很有帮助。但不幸的是,它无法识别派生类。例如如果我有 List<UserGet> 它只会将 UserGet 实例放入其中。不是各自的铸造类,例如CustomUserGetDto。

标签: c# linq entity-framework-core


【解决方案1】:

请改用条件运算符:

public List<UserGetDto> GetUsers()
{
    return _context.Users
        .Select(user => 
            user is TestUser ? new TestUserGetDto()
            {
                Title = ((TestUser)user).Title
                ...
            }
            : user is CustomUser ? new CustomUserGetDto()
            {
                Value = ((CustomUser)user).Value
                 ... 
            },
            : new UserGetDto(){...}
        }
        .ToList();

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 2021-03-06
    • 2022-10-07
    • 1970-01-01
    • 2019-11-07
    • 2022-01-25
    • 2011-07-23
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多