0

当我需要从表(数据库)中获取多条记录时,我的方法会填充特定类的列表(我的所有数据访问层方法都将列表用于基于集合的选择语句。我不使用数据表/数据集或 xmlDocument 方法) . 所以让我们假设下一个简化的场景;我有两个类——带有这些字段/属性的客户和订单:

Class Customer{
   int IDCustomer
   string CustomerName
   string CustomerAddress
   string CustomerCity
}

Class Order{
   int IDOrder
   int IDCustomer
   string SalePersonName
   decimal OrderSubTotal
   datetime OrderDateCreated
}

因此,假设我们需要一个方法,将来自 Order 类属性的所有数据 + CustomerName 和 Customer 类中的 CustomerCity 传递到 UI (ObjectDataSource)。我希望我的 Order 类方法看起来像:

public List<Order> SelectAll(){ 
}

那么我应该使用哪种方法来实现这一点?如何设置订单类,使其包含关于最佳实践、面向对象范式、性能等的两个额外属性(CustomerName 和 CustomerCity):

方法 A:


Class Order{
   int IDOrder
   int IDCustomer
   string SalePersonName
   decimal OrderSubTotal
   datetime OrderDateCreated
   //--- plus two extra properties of type string
   string CustomerName
   string CustomerCity
}

方法 B:


Class Order{
   int IDOrder
   int IDCustomer
   string SalePersonName
   decimal OrderSubTotal
   datetime OrderDateCreated
   //--- plus extra property of type Customer
   Customer _Customer
}

方法 C:


???

我在 .NET 2.0 上。

4

5 回答 5

1

创建另一个类来展平充当视图模型的查询,我没有问题。

于 2009-06-10T21:44:56.037 回答
0

因为这是一个设计问题,我认为需要更多信息才能给出完整的答案,因为我认为这取决于具体情况。

如果您已经加载了 Order 对象和 Customer 对象并将它们用于表示层中的不同事物,那么创建一个专门的类来展平显示数据是一个很好的解决方案。

如果您正在加载信息以显示订单列表并需要每个订单的客户信息,那么我不得不问为什么您不只是创建一个包含相关字段的 CustomerOrder 类并加载它以开始因为您无论如何都不会使用客户的额外数据。

所有这些设计决策都取决于外部因素。最后,我想说正确的设计决策通常是满足您需求的最简单的决策。

于 2009-06-11T01:18:47.027 回答
0

毫无疑问,B。客户和订单之间存在一对多的关系——一个客户有很多订单(订单列表),一个订单有一个客户(客户类型的标量属性)。

public class Customer
{
   public Int32 Id { get; private set; }
   public String Name { get; private set; }
   public String Address { get; private set; }
   public String City { get; private set; }

   public IList<Order> Orders { get { return this.orders; } }
   private readonly IList<Orders> orders = new List<Orders>();
}

Class Order
{
   public Int32 Id { get; private set; }
   public String SalesPersonName { get; private set; }
   public Decimal SubTotal { get; private set; }

   public Customer Customer { get; private set; }
}

对于用户界面,您可以创建一个单独的类来包装订单,如下所示。

public class OrderView
{
    private readonly Order order;

    public OrderView(Order order)
    {
        this.order = order;
    }

    public Decimal SubTotal { get { return this.order.SubTotal; } }
    public String CustomerCity { get { return this.order.Customer.City; } }
    // ...
}
于 2009-06-10T21:42:30.113 回答
0

如果您允许存在一对多的客户到订单关系,则具有订单列表的客户类将遵循。虽然这与您的原始请求略有不同,但您可能会更轻松地操纵客户及其包含的订单,而不是从父级复制成员。

Class Customer{
   int IDCustomer
   string CustomerName
   string CustomerAddress
   string CustomerCity
   List<Order> orders;

   public List<Order> SelectAll(){ return orders; }
}

Class Order{
   int IDOrder
   //int IDCustomer -not necessary as parent contains this info
   string SalePersonName
   decimal OrderSubTotal
   datetime OrderDateCreated
}
于 2009-06-10T22:32:03.477 回答
0

这听起来像是ORM的工作。

于 2009-06-10T21:45:09.547 回答