5
  1. DTO オブジェクトのマッピングを作成し、ドメインの代わりにクエリを実行しても問題ありませんか? そうでない場合は、その理由を説明してください。
  2. これらの dtos がいくつか必要な場合はどうすればよいですか?

  • DTo は読み取り専用です
  • ID は NH によって自動生成されます
  • 将来、これらの dto は、リンクされた dto へのマッピングを設定する予定です。
  • DTO を使用してクエリのサイズを縮小する

    <class name="Person" table="`APP_Person`">  
        <property name="FirstName" type="string" length="512" />
        <property name="Age" type="int" /> 
        <property name="SocialNumber" type="int" />
        <property name="PassportId" type="int" />
        <property name="Salary" type="int" />
    </class>
    
    <class  name="PersonDTO" table="`APP_Person`">  
        <property name="FirstName" type="string" length="512" />
        <property name="Age" type="int" />
    </class>
    
4

1 に答える 1

10

DTOオブジェクトをマップ/永続化する必要はありません。通常、データを読み取り専用にして、アプリケーションの他のレイヤー(Webサービス、ビューなど)に送信します。

Personリストを返すエンティティに対してクエリを作成できますPersonDTO。メソッドを見てくださいSetResultTransformer。このような何かを試してみてください:

var query = session.CreateQuery("select p.FirstName, p.Age from Person p order by p.FirstName")
                   .SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(PersonDTO)))
                   .List<PersonDTO>();

そしてあなたのDTO:

public class PersonDTO 
{
   public string FirstName { get; set; }
   public int Age { get; set; }
}

クエリの列の結果は、hqlDTOを構築し、オブジェクトをハイドレイトするときにNHibernateが正しい反映を行うために、DTOのプロパティと同じ名前を持つ必要があります。

Linq

結果として(またはDTOのリスト)を使用linqすることもできます。DTOサンプルの場合:

var query = Session.Query<Person>().OrderBy(x => x.FirstName)
                   .Select(x = new PersonDTO() { FirstName = x.FirstName, Age = x.Age })
                   .ToList();

この記事を見てください:http://gustavoringel.blogspot.com.br/2009/02/creating-dto-in-nhibernate-hql-using.html

于 2012-12-05T14:21:19.007 に答える