【发布时间】:2021-07-23 03:10:26
【问题描述】:
在使用inheritance in EF Core 时,我正在努力避免重复投影逻辑。
这是我的场景:我有三种类型:
-
Lesson(这是一个抽象类)(属性:Id、Title等) -
ArticleLesson(继承自Lesson)(属性:Content、TotalWoddsCount等) -
VideoLesson(继承自Lesson)(属性:VideoUrl、Duration等)
几乎所有事情都由 EF Core 正确处理,我使用的是默认的 Table-Per-Hierarchy (TPH) 方法。
当我想从数据库中检索课程并且我需要ArticleLesson 和VideoLesson 之间的一些共享列(即Lesson 的一些属性)时,就会出现问题,另外,还有一些特定于属性到ArticleLesson 或VideoLesson。这是我想出的表达方式:
var r1 = dbContext.Lessons.Select<Lesson, LessonDto>(l =>
l is ArticleLesson
? new ArticleLessonDto
{
Id = l.Id, // This is repeated below
Title = l.Title, // This is repeated below
// ...other properties that I would have to repeat below
Content = (l as ArticleLesson).Content,
}
: l is VideoLesson
? new VideoLessonDto
{
Id = l.Id, // This is repeated above
Title = l.Title, // This is repeated above
// ...other properties that I would have to repeat above
VideoUrl = (l as VideoLesson).VideoUrl,
}
: null
)
.ToList();
如您所见,我将共享属性部分重复了两次。在这个例子中只有两个属性被重复,Id 和 Title,但在现实世界中你可以有几十个;并且不得不像这样重复所有这些将是一个h。
有什么办法可以让这个投影表达式更简洁,避免重复?
【问题讨论】:
-
简短回答:此类实施的努力将会很高。最好在这个地方复制/粘贴。如果您有大量此类案例,请收集它们并创建新问题。
标签: c# entity-framework linq entity-framework-core