如何在查询一对多数据时将通用存储库与 petapoco 一起使用

本文关键字:存储 petapoco 一起 查询 多数据 | 更新日期: 2023-09-27 17:55:30

我正在使用一个通用存储库以及petapoco micro ORM。我正在将其用于罗斯文数据库作为示例项目。由于 petapoco 不处理任何连接,因此我在 Customer 类中创建了一个列表属性。以下是我的存储库类的一部分

public T GetById(string id)
    {
        return this.db.SingleOrDefault<T>("WHERE CustomerId = @0", id);
    }
    public Customer GetOrdersAndCustomersByCustomerId(string id)
    {
        var customer = this.db.SingleOrDefault<Customer>("WHERE CustomerId =    @0", id);
        var orders = this.db.Query<Order>("WHERE CustomerId = @0", id).ToList();
        if (customer != null && orders != null)
        {
            customer.Orders = new List<Order>();
            customer.Orders.AddRange(orders);
        }
        return customer;
    }
虽然 GetById

使用通用变量 T,但我无法在 GetOrdersAndCustomersByCustomerId 中使用它。相反,我必须使用特定的 Customer 类。 否则我无法使用这一行:客户。订单.添加范围(订单);正如它所抱怨的那样,"T"没有"订单"的定义。有没有办法使这种方法通用?

如何在查询一对多数据时将通用存储库与 petapoco 一起使用

不,这是不可能的。想想如果你用与Customer不同的T调用该方法会发生什么。这没有意义:

var products = genericRepository<Product>.GetOrdersAndCustomersByCustomerId(...);
// your method
public Customer GetOrdersAndCustomersByCustomerId(string id)
{
    var customer = this.db.SingleOrDefault<T>("WHERE CustomerId =    @0", id);
    var orders = this.db.Query<Order>("WHERE CustomerId = @0", id).ToList();
    if (customer != null && orders != null)
    {
        // what now? customer is of type product.
        customer.Orders = new List<Order>();
        customer.Orders.AddRange(orders);
    }
    return customer;
}

您可能想要的是一个非通用存储库。IMO(很多人都同意),通用存储库不是一个好主意。如果是,那么已经有一个可重用的通用存储库可用。

我认为你最好创建一个ICustomerRepository.