4

次のようなビューがあります。

代替テキスト

このビューの ViewModel をどのように表現すべきかを理解しようとしています。各「エージェンシー」は複数の「ビジネス ユニット」を持つことができ、各「ビジネス ユニット」は複数の「クライアント」を持つことができます。

データベースでは、これをマッピング テーブルと、Agency、BusinessUnit、および Client テーブルの外部キーで簡単に表現できます。

ただし、今度は LINQ を使用してデータベースからこのデータをクエリし、このツリーのような構造を表す ViewModel オブジェクトを構築して、View がレンダリングできるようにする必要があります。

どのデータ構造を使用すべきか、または C# コードのこの階層構造で ViewModel がどのように見えるかについてのヒントを誰か教えてもらえますか? このビューに渡す ViewModel オブジェクトを作成する必要があります。

ViewModel を表現する方法に関する提案は大歓迎です!

4

3 に答える 3

1

ビュー データに List インスタンスを格納するだけですか?

public class Agency
{
   public List<BusinessUnit> Units;
   public string Name;
   public int NumberOfAccounts
   {
      get 
      {
         int ret = 0;
         foreach(BusinessUnit unit in units)
            ret += unit.NumberOfAccounts;
         return ret;
      }
   }
   // ... continue this strategy for other properties
}
public class BusinessUnit
{
   public List<Client> clients;
   public string Name;
   public int NumberOfAccounts
   {
      get 
      {
         int ret = 0;
         foreach(Client client in clients)
            ret += client.NumberOfAccounts;
         return ret;
      }
   }
   // ... continue this strategy for other properties

}
public class Client
{
   public string Name;
   public int NumberOfAccounts;
}
于 2009-06-19T16:19:27.797 に答える
0

最近、「ADO .Net Entity Data Model」テンプレートを使用して、階層データをサポートするMSSQLデータベースへの接続を制御しており、正常に機能しています。

プレゼンテーション層をデータモデルに直接結び付けることができます。

キーがデータベースに正しく設定されていれば、すぐに起動して実行できます。ADO.Net3.5も必要だと思います。

ADO.NETEntityFrameworkエンティティの作成

エンティティに関するMS情報

于 2009-06-19T16:01:20.637 に答える
0

Linq2Sql の実装にデータベースと同じリレーションシップがあると仮定すると (デザイナーにドラッグ アンド ドロップした場合、確実にそうします)、ここに私がアプローチする方法を示します。

各セクション (あなたの場合はエージェンシー) を表すエージェンシー タイプの強く型付けされた部分ビューを作成し、AgencyReportSection.ascx と呼びます。このコントロールは、エージェンシーを取り、そのビジネス ユニットを反復処理し、クライアントを反復処理します。

データをパッケージ化する場所はどこでも、次のようにします。

DataContext context = new DataContext();
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Agency>(a => a.BusinessUnit);
options.LoadWith<BusinessUnit>(b => b.Client); 

context.LoadOptions = options;

これにより、コンテキストがエージェンシーを取得すると、定義された関係に従い、それらのオブジェクトも提供されます。したがって、次のようになります。

Agency a = context.Agency.FirstOrDefault();
IEnumerable<BusinessUnit> units = a.BusinessUnits;
IEnumerable<Client> clients = units.Clients;

あなたのビューは次のようなことができます:

<% foreach(var agency in agencies)%{>
<% Html.RenderPartial("AgencyReportSection"); %> 
<%}%>

データ ロード オプションを実行する理由は、ビューでの遅延読み込みを回避するためです。モデルに必要なすべてのデータをパックさせます。

あなたの質問を正しく理解できたと思います...

于 2009-06-20T01:30:49.953 に答える