2013-03-21 106 views
1

请查看我在此处询问的问题中的代码:Data Access Layer returns DataTable数据访问层 - 包含两个实体的返回类型

我有数据传输对象来表示持久实体。例如,假设我在数据库中有一个名为Customer的表和一个名为Order的表:

CREATE TABLE Customer(ID int,Name VARCHAR(100),Primary Key(ID)) CREATE TABLE Order(ID int,名称VARCHAR(100),主键(ID))

假设我想从数据库中检索与客户相关的所有订单。我可以看到两个选项:

1)具有结合客户和订单如下类型(注意顺序排列):

Public Class CustomerOrder 
    Private _CustomerID As Integer 
    Private _Name As String 
    Private _OrderID() As Integer 

    Public Property CustomerID() As Integer 
     Get 
      Return _CustomerID 
     End Get 
     Set(ByVal value As Integer) 
      _CustomerID = value 
     End Set 
    End Property 

    Public Property Name() As Integer 
     Get 
      Return _Name 
     End Get 
     Set(ByVal value As Integer) 
      _Name = value 
     End Set 
    End Property 

    Public Property OrderID() As Integer() 
     Get 
      Return _OrderID 
     End Get 
     Set(ByVal value As Integer()) 
      _OrderID = value 
     End Set 
    End Property 

End Class 

2)返回一个客户对象和订单对象的列表。客户和订单会有自己的类型。

我相信选项1更好,但如果类型只应该定位到一个数据库表,我就会游荡。

回答

1

这是一个味道的问题,你想使用什么设计模式。我在我的项目中使用了这两个选项。我可以建议你创建Orders属性作为generic list(或IEnumerable)的Order对象,不要初始化它(null)并使其只读,这样如果你不必使用它,就不会浪费内存并在您不会使用的东西中处理时间。然后当它被访问时,你可以简单地填写它在那里。

Private _OrderID As Integer() 
Public ReadOnly Property OrderID() As Integer() 
    Get 
     If (_OrderID Is Nothing Or _OrderID.Length = 0) Then 
      GetOrders(_CustomerID) 
     End If 
     Return _OrderID 
    End Get 
End Property 

再次,我相信在这个特定的情况下,任何最适合您的方式将是最好的选择。如果您只需要ID,请使用您的整数数组,如果您需要访问订单的其他属性,请使用数组,对象,LINQ或其他适合您的更好的数据。

+1

谢谢。如果客户和订单之间存在一对一的关系,您的观点会改变吗?即类中的orderid将是一个整数而不是整数数组。 +1。 – w0051977 2013-03-21 21:22:01

+0

我认为这取决于我将访问任何对象的程度。如果我发现自己同时使用这两种方法,我可能只会创建一个具有订单和客户属性的类。我所有的存储过程和视图都会带来所有的数据。如果您查看EntityFramework以及它将执行此操作的方式,它会为您的客户类创建订单列表。 – 2013-03-21 21:24:02

+0

您是不是指名为CustomerOrder的类,其中包含Customer表中所有字段的属性以及Order表中的所有字段? – w0051977 2013-03-21 21:30:09