首页 > 解决方案 > 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;
    }
     
}

我在方法中有泛型和表达式是因为我想让调用者定义什么结果应该是例如来自产品的部分数据而不是产品的所有数据。

现在我遇到一个问题。如果查询不太复杂,例如要加入更多表,结果数据不仅返回产品数据,还可能是购买产品的用户数量等。

那些返回复杂数据集的复杂查询会在哪里?

标签: c#databaserepository-pattern

解决方案


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以更结构化的方式实现您的功能。


推荐阅读