2011-02-04 2 views
0

私はnhiberante 3.0でasp mvcを使ってビルドしているWebアプリケーションを持っています。 私は私のデータを照会するため、次のコードを持っている -mhcを使ってnhibernateを使ってエンティティを読み込むことが熱望されたときにヒットします

ICriteria rowCount = session.CreateCriteria(typeof(entity1)); 

rowCount.SetResultTransformer(CriteriaSpecification.DistinctRootEntity) 
       .SetProjection(Projections.RowCount()); 

ICriteria query = session.CreateCriteria(typeof(entity1)); 

query.SetFetchMode("entity2", FetchMode.Eager); 
query.SetResultTransformer(CriteriaSpecification.DistinctRootEntity); 
query.SetFirstResult((pageIndex - 1) * pageSize); 
query.SetMaxResults(pageSize); 

query.Future<entity1>(); 

return new PagedList<entity1>(query.List<cshearin>(), pageIndex, pageSize, rowCount.List<Int32>().FirstOrDefault());  

さて、これは私の見解に正しいデータを返しているが、パフォーマンスはひどいです。私がエンティティ2を読み込もうとしないなら、パフォーマンスは素晴らしいです。その唯一の問題は、私が読んだデータを使って作業をしているということは良い習慣ではないということです。

このビューを少しでもやってもいいですか、それとも悪い習慣ですか?悪い習慣であれば、データアクセスのためにこのクラスを構築するより良い方法がありますか?

ありがとうございました。

EDIT - 私のマッピングはかなり簡単です。ここに簡略版があります。
entity1 -

<class name="entity1"> 
    <id name="entity1_id"> 
     <generator class="guid.comb"></generator> 
    </id> 

    <property name="column"></property> 
    <property name="column"></property>\ 

    <bag name="entity2" cascade="all"> 
     <key column="entity2_fk" /> 
     <one-to-many class="entity2"/> 
    </bag> 

    </class> 

とentity2 - 私はまた私のビューに渡す投影を使用を検討する必要があります

<class name="entity2"> 
    <id name="entity2_id"> 
     <generator class="guid.comb"></generator> 
    </id> 

    <many-to-one name="entity1" column="entity2_fk" /> 

    <property name="columnx"></property> 
    <property name="columny"></property> 

    </class> 

- 有効な回答かもしれません。

+0

本当に評価するには、マッピングを確認する必要があります。しかし、私は通常、NHibernate Sessionによって管理される必要がないため、エンティティを私のビューに渡さず、代わりにProjectionsを使用します。最後の一点ICriteriaには 'UniqueResult'というメソッドがあり、これをrowCountクエリに使用することができます。 – Vadim

+0

ヤズ、エンティティの代わりに投影を使用して詳細を教えてください。 – czuroski

答えて

3

パフォーマンスが悪い理由がわかります。 NHによって生成されたクエリを見るにはProfiler(Sql Server)のようなツールを使用するか、NHがコンソール(show_sql)またはログに書き込むようにします。

あなたは可能性があります

  • が一つの代わりに1バッチでentity2を取得するにはバッチサイズのentity2
  • メイク使用を取得するために、外部キーにインデックスを必要とします。
  • 注文は、最新のデータを最初に読み取るために作成日によって既にDBMSのキャッシュに存在する可能性があります。
+0

索引を追加すると大いに役立ちました。私はそれを見落とした。 – czuroski

関連する問題