0

テーブル(データベース)から複数のレコードを取得する必要がある場合、私のメソッドは特定のクラスのリストを設定します(私のデータ アクセス レイヤー メソッドはすべて、セット ベースの選択ステートメントにリストを使用します。データテーブル/データセットまたは xmlDocument アプローチは使用しません)。 . それでは、次の単純化されたシナリオを考えてみましょう。これらのフィールド/プロパティを持つ顧客と注文の2つのクラスがあります。

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

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

したがって、UI (ObjectDataSource) に Order クラス プロパティ + CustomerName および Customer クラスからの CustomerCity からのすべてのデータを配信するメソッドが必要であるとしましょう。Order クラスのメソッドは次のようになります。

public List<Order> SelectAll(){ 
}

これを達成するには、どのアプローチを使用する必要がありますか?ベスト プラクティス、オブジェクト指向パラダイム、パフォーマンスなどに関する 2 つの追加プロパティ (CustomerName と CustomerCity) を含むように Order クラスをセットアップする方法:

アプローチ 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

1 対多の顧客と注文の関係が存在することを許可すると、注文のリストを持つ顧客クラスが続きます。これは元の要求とは少し異なりますが、親からメンバーを複製するよりも、顧客とそれに含まれる注文を簡単に操作できるでしょう。

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

質問はありません、B. 顧客と注文の間には 1 対多の関係があります。顧客には多くの注文 (注文のリスト) があり、注文には 1 つの顧客 (顧客タイプのスカラー プロパティ) があります。

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

これはORMの仕事のように思えます。

于 2009-06-10T21:45:09.547 に答える