c# - C# 存储库模式?复杂的查询仍然放在存储库中?
问题描述
我正在学习存储库模式。我已经设法编写代码来做到这一点。
我读过文章说每个存储库都与一个实体相关。
这就是我的存储库:
public class ProductRepository : BaseProductRepository
{
public ProductRepository(StoreDBContext context) : base(context)
{
this.context = context;
}
public override async Task<IEnumerable<TResult>> GetTopProducts<TResult>(Func<Product, TResult> selectFunc)
{
var products = this.context.Product
.Select(selectFunc)
.ToList();
return products;
}
}
我在方法中有泛型和表达式是因为我想让调用者定义什么结果应该是例如来自产品的部分数据而不是产品的所有数据。
现在我遇到一个问题。如果查询不太复杂,例如要加入更多表,结果数据不仅返回产品数据,还可能是购买产品的用户数量等。
那些返回复杂数据集的复杂查询会在哪里?
解决方案
TResult 应该是与该方法相关的“形状”。它当然不应该是数据库实体。
在您的情况下,GetTopProducts 的 TResult 将是产品摘要的集合。
class GetTopProductsResult
{
public IEnumerable<Product> TopProducts {get;set;}
public class Product
{
public int Id {get;set;}
public string Name {get;set;}
public int UnitsSold {get;set;}
}
}
我还建议您查看AutoMapper,它基本上会Select
以更结构化的方式实现您的功能。
推荐阅读
- shell - POSIX Shell sh 获取当前执行的行号
- javascript - JS:使用没有异步/等待的超时迭代列表
- flowtype - 如何返回传递给函数的相同类型?
- npm - 使用 package.json 构建应用程序时,如何选择不同的依赖版本进行开发?
- reactjs - 如何在反应中加载src和公共文件夹之外的图像
- javascript - 将 Promise 创建和获取修改为异步 nodejs 应用程序的详细分析
- html - 每个块级元素是否默认都有 text-align: left ?
- java - 对于某些访问被拒绝的用户,OpenProcess() 失败
- powerbi - 不再存在的值显示 Power BI 错误
- r - R中的子集线性回归