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

How to use generic repository with petapoco when querying one-to-many data

我正在使用通用存储库和 petapoco micro ORM。我将它作为示例项目用于 Northwind 数据库。由于 petapoco 不处理任何连接,我在客户 class 中创建了一个列表 属性。以下是我的资料库的一部分 class

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 中使用它。相反,我必须使用特定的客户 class。否则我无法使用这一行:customer.Orders.AddRange(orders);正如它抱怨的那样,"T" 没有 "Orders" 的定义。有没有办法使这个方法通用?

不,那不可能。想一想如果您使用与 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