如何在查询一对多数据时使用带有petapoco的通用存储库

时间:2016-07-05 18:52:09

标签: c# petapoco micro-orm

我正在使用通用存储库以及petapoco micro ORM。我将它作为示例项目用于Northwind数据库。由于petapoco不处理任何连接,我在Customer类中创建了一个list属性。以下是我的Repository类

的一部分
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类。否则我无法使用此行:customer.Orders.AddRange(orders);因为它抱怨,“T”没有“订单”的定义。无论如何都要使这种方法通用吗?

1 个答案:

答案 0 :(得分:0)

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

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