【发布时间】:2021-11-15 08:52:22
【问题描述】:
我的解决方案有几个层,其中之一是我实现存储库模式的DataAccess 层。
我的主要关注点是EntityFramework 仅在DataAccess 层中被引用。
我需要在查询中包含关系,因此我调整了查询方法以接收 Includes 作为输入。
/// <inheritdoc/>
public IQueryable<T> AsQueryable(params Expression<Func<T, object>>[] includes)
{
var query = _dbSet.AsQueryable();
if (includes != null)
{
query = includes.Aggregate(query,
(current, include) => current.Include(include));
}
return query;
}
使用示例:
// Books :: ICollection<Book>
var query = _repository.AsQueryable(e => e.Books);
使用上面的示例,例如,我如何在查询中包含Book -> Author 关系? Books 属性是一个集合,因此我无法引用 Author 属性。
示例:.AsQueryable(e => e.Books, e => Books.Author) 或 .AsQueryable(e => e.Books.ChildInclude(b => b.Author))
【问题讨论】:
-
也许你应该先解释一下为什么现在不能。
-
@GertArnold 仅仅因为
Books是一个集合,我无法引用Author属性 -
请将其添加到您的问题中。
-
看起来通过暴露(泄漏)可查询的实体框架,您正试图在现有框架之上构建自己的“ORM”:)
-
一个选项 - 将 DbContext 视为通用存储库,因为您已经尝试将通用存储库用作 DbContext ;)。第二种选择 - 不公开可查询或查询表达式,而是接受一些自定义查询类型(命令或请求)并在存储库内部根据该类型生成查询并返回“物化”集合作为结果(请参阅规范模式)
标签: c# entity-framework .net-core