查询一对多数据时如何将通用存储库与 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
。
我正在使用通用存储库和 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
。