私は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>
- 有効な回答かもしれません。
本当に評価するには、マッピングを確認する必要があります。しかし、私は通常、NHibernate Sessionによって管理される必要がないため、エンティティを私のビューに渡さず、代わりにProjectionsを使用します。最後の一点ICriteriaには 'UniqueResult'というメソッドがあり、これをrowCountクエリに使用することができます。 – Vadim
ヤズ、エンティティの代わりに投影を使用して詳細を教えてください。 – czuroski