从不适合任何模型实体或扩展某些模型实体的存储库返回临时(逐案自定义)数据的推荐方法是什么?
101 的例子是无处不在的 hello word 应用程序:一个博客系统。假设您要加载一个帖子列表,其中帖子条目包含一些 Post 实体中不存在的附加信息。假设它是评论的数量以及最后评论的日期和时间。如果使用普通的旧 SQL 并直接从数据库中读取数据,这将是非常微不足道的。如果我负担不起为每个帖子加载整个评论集合,并且我想在一次数据库命中中完成,我应该如何使用存储库模式以最佳方式完成它?这种情况有没有常用的模式?现在假设您有一个中等复杂的 Web 应用程序,其中每个页面需要稍微不同的自定义数据,并且无法加载完整的层次结构(性能、内存要求等)。
一些随机的想法:
向可以由自定义数据填充的每个模型添加一个属性列表。
逐个子类模型实体,并为每个子类创建自定义阅读器。
使用 LINQ、编写即席查询和读取匿名类。
注:我最近也问过一个类似的问题,不过好像太笼统了,没有引起太多关注。
例子:
根据以下答案中的建议,我添加了一个更具体的示例。这是我试图描述的情况:
IEnumarable<Post> posts = repository.GetPostsByPage(1);
foreach (Post post in posts)
{
// snip: push post title, content, etc. to view
// determine the post count and latest comment date
int commentCount = post.Comments.Count();
DateTime newestCommentDate = post.Comments.Max(c => c.Date);
// snip: push the count and date to view
}
如果我不做任何额外的事情并使用现成的 ORM,这将导致 n+1 个查询或可能一个查询加载所有帖子和评论。但最佳情况下,我希望能够只执行一个 SQL,该 SQL 将为每个帖子返回一行,包括帖子标题、正文等以及评论计数和最近的评论日期。这在 SQL 中是微不足道的。问题是我的存储库将无法读取此类数据并将其放入模型中。最大日期和计数在哪里?
我不是在问如何做到这一点。您总是可以以某种方式做到这一点:向存储库添加额外的方法,添加新类,特殊实体,使用 LINQ 等,但我想我的问题如下。为什么存储库模式和正确的模型驱动开发如此广泛接受,但它们似乎并没有解决这种看似非常普遍和基本的情况。