【发布时间】: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