1

WinFormsクライアントがデータベースを直接呼び出す2層アプリケーションに取り組んでいます。シナリオの1つでは、顧客エンティティのリストをユーザーに表示する必要があります。問題は、Customerエンティティに多くのプロパティ(かなり重いものもあります)が含まれていて、必要なのはそのうちの2つ(名前と名前)だけであるということです。したがって、パフォーマンスを向上させ、プレゼンテーションロジックをより明確にするために、必要なプロパティのみを使用してある種のCustomerSummaryViewModelクラスを作成し、NHibernateのプロジェクション機能を使用してロードします。ここでの私の懸念は、この場合、私のデータアクセスロジックがプレゼンテーションと結合し、概念的に間違っているように見えることです。

これは大丈夫だと思いますか、それとももっと良い解決策がありますか?

4

1 に答える 1

0

CustomerSummaryViewModelをレポート(CustomerSummaryReport)と見なすことができると思います。このようなシナリオについてエンティティをクエリし、レポートとして扱うのは問題ありません。ほとんどのレポートはより複雑で、複数のエンティティと集計クエリを使用します。このレポートは非​​常に単純ですが、それでもレポートのように使用できます。

また、パフォーマンスが重要であるとおっしゃっています。これが、個別のレポートクエリとDTOを使用するもう1つの理由です。顧客エンティティは、使用する「メイン」エンティティの1つのように聞こえます。遅延読み込みプロパティが初期化されていない状態でデータベースからそれらを取得するのにかなりの時間がかかるということは、レポートクエリを使用してそれらに関する情報を取得する代わりに、顧客エンティティ自体を最適化するための警告になる可能性があります。これが必要な場合を見たので、ただの警告です。

ちなみに、次のような簡単な構文では、射影の代わりにlinqを検討できます。

var reports = session.Linq<Customer>()
  .Where(condition)
  .Select(customer => new Report 
   { 
       FirstName = customer.FirstName, 
       LastName = customer.LastName 
   })
  .ToList();
于 2010-09-12T21:40:27.890 に答える