これが実際の例です。
オンラインストアがあり、ドメインクラスの1つがBrand
「Samsung」のようなものであるとします。このクラスには、整数Identity
、a Name
、フリーテキストDescription
フィールド、Vendor
オブジェクトへの参照など、大量のプロパティが関連付けられています。
ここで、オンラインストアで提供されているすべてのブランドのリストを含むメニューを表示するとします。あなたがそうするだけならsession.CreateCriteria<Brand>().List()
、あなたは確かにすべてのブランドを手に入れるつもりです。Description
ただし、データベースからsへの長いフィールドと参照をすべて吸い取っているVendor
ので、メニューを表示するためにそれは必要ありません。Name
とが必要ですIdentity
。パフォーマンス面では、データベースからこの余分なデータをすべて吸い込むと、処理速度が低下し、不要になります。
Identity
代わりに、とName
それを呼び出すだけを含む「プロジェクション」オブジェクトを作成できます。たとえば、NameIdentityPair
次のようになります。
public class NameIdentityPair
{
public int Identity { get; set; }
public string Name { get; set; }
}
そして、NHibernateに、結果セットをプロジェクションに変換するように指示することで、手元のタスクを実行するために本当に必要なデータのみを選択するように指示できます。
var brandProjections = this.session.CreateCriteria<Brand>()
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Name"), "Name")
.Add(Projections.Property("Identity"), "Identity"))
.SetResultTransformer(Transformers.AliasToBean<NameIdentityPair>())
.List<NameIdentityPair>();
foreach (var brandProjection in brandProjections)
{
Console.WriteLine(
"Identity: {0}, Name: {1}",
brandProjection.Identity,
brandProjection.Name);
}
これで、Brand
sのリストはなく、代わりにsのリストがあり、NHibernateは、オブジェクトをハイドレイトするために必要なすべてを取得する大規模なSQLステートメントとは対照的に、このプロジェクションを取得するNameIdentityPair
ようなSQLステートメントのみを発行します(例:)。SELECT b.Identity, b.Name from dbo.Brand b
Brand
SELECT b.Identity, b.Name, b.Description from dbo.brand b left join dbo.vendor v ....
お役に立てれば。