29

nHibernateとそのユーティリティライブラリであるfluentnhibernateの新しいユーザーとして、私は優れたデータベースで危険を冒すのに十分なことを学ぼうとしています。

プロジェクションの概念を理解するのは非常に困難です。具体的には、彼らは世界で何ですか?

私は文字通り「予測とは何ですか? 」について正確な検索を行いました。'および' nHibernateのプロジェクト'および' nHibernate、Projections、Definition 'など。そして私はまだ非常に混乱しています。これまでで最も役立つ投稿は、この他のStackOverflowの質問とColinRamsayによるこのブログ投稿です。しかし、私はまだ非常に混乱しています。私のデータベースに関する知識は、せいぜいエントリーレベルのままです。

予測とは何か、なぜそれらを使用したいのか、何を達成しているのかなどはよくわかりません。ブログ投稿で、彼が整数のリストを取得するためにそれらを使用していることがわかります(主キーと思われます)。それらを別のクエリで使用できますが、これは機能の仕方とその理由があいまいです。

4

3 に答える 3

75

これが実際の例です。

オンラインストアがあり、ドメインクラスの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);
}

これで、Brandsのリストはなく、代わりにsのリストがあり、NHibernateは、オブジェクトをハイドレイトするために必要なすべてを取得する大規模なSQLステートメントとは対照的に、このプロジェクションを取得するNameIdentityPairようなSQLステートメントのみを発行します(例:)。SELECT b.Identity, b.Name from dbo.Brand bBrandSELECT b.Identity, b.Name, b.Description from dbo.brand b left join dbo.vendor v ....

お役に立てれば。

于 2011-05-26T15:11:45.510 に答える
2

SQLに精通している場合、プロジェクションはSELECTクエリの句であり、使用可能な結果から返すフィールドを選択するために使用されます。

たとえば、、、、、およびフィールドがあるPersonと仮定します。クエリですべてを返すようにする場合は、SQLの場合と同様に、プロジェクションを省略できます。名と名前だけが必要な場合は、SQL用語であるand--を使用してプロジェクションを作成します。FirstNameLastNameAddressPhoneSELECT * FROM PersonFirstNameLastNameSELECT FirstName, LastName FROM Person

于 2011-05-26T15:08:42.077 に答える
1

射影を使用して、SUM、COUNT ...などのSQL関数を呼び出すか、エンティティを返さずに単一のフィールドを選択できます。

「...トランザクションスコープにエンティティ自体をロードするオーバーヘッドなしで、1つまたは複数のエンティティのプロパティのみを取得します。これはレポートクエリと呼ばれることもあります。より正確には、プロジェクションと呼ばれます。」[NHibernateの動作]

于 2011-05-26T14:43:03.723 に答える