关于 EF core 的问题,因为我不知道如何干净地完成此场景。 这不是我的实际场景,而是一个简化的示例。
假设我有一个名为“Person”的类,其中有很多“Meals”。 在实体类“Person”中,有一个属性“LastMealDateTime”,它通过 Linq 查询返回该人最后一顿饭的日期。 这在业务层级别非常有效,这正是我想要的。
但是,我想列出所有“人”记录以及他们吃的最后一顿饭(可能导出到文件或网格......)。
我可以加载所有“Person”记录并获取“LastMealDateTime”属性,但这将导致 N... 对数据库的调用,如果有 1000 条 Person 记录,则会导致 1000 条额外调用。
性能问题的解决方案是在数据库中创建一个视图并直接绑定到该视图。 想象一下:
Select
PersonName,
(SELECT TOP 1 MealDateTime FROM Meal where Meal.PersonId = Person.Id)
FROM PERSON .....
这很棒,很好而且高效,因为我们将其留给数据库引擎来完成所有连接工作等。
但是,这个视图现在包含一些业务逻辑(获取一个人吃的最后一顿饭),它复制了 Person 类中的属性“LastMealDateTime”。 我不想在多个地方执行这个逻辑。
这是一个非常简单的示例,具有一些非常简单的业务逻辑,说实话,我可能会放弃这样的事情,但如果逻辑要复杂得多,我们就会重复它。
人们想出了哪些巧妙的解决方案来解决这个问题?
您可以通过利用 EF Core 来实现此目的,无需使用视图,如下所示:
使用
Include
仅返回最后一餐:
var query = ctx.Person
.Include(p => p.Meals.OrderByDescending(m => m.MealDateTime).Take(1));
或与
Select
:
var query = ctx.Person
.Select(p => new PersonDto
{
Id = p.Id,
LastMeal = p.Meals.OrderByDescending(m => m.MealDateTime).FirstOrDefault()
});