NH Criteria を使用してエンティティを取得し、選択フィールドをカスタム クラスに投影しています (MVC ビューに表示するためにデータを ViewModel に投影するのと少し似ています)。
これは、ProjectionList を使用して簡単に行うことができます。
var emailCriteria = mSession.CreateCriteria<Email>();
emailCriteria.SetProjection(
Projections.ProjectionList()
.Add(Projections.Property("Subject"), "Subject")
);
emailCriteria.SetResultTransformer(Transformers.AliasToBean<EmailDataModel>());
var result = emailCriteria.List<EmailDataModel>();
ただし、私のエンティティにはコレクションが含まれており、それも元に戻し、コレクションとしてカスタム クラスに投影したいと考えています。
私のドメイン モデルは (簡略化された形式で) 次のようになります。
public class Email {
public string Subject
public List<EmailAttachment> Attachments
etc...
}
public class EmailAttachment {
public UploadedFile File
}
public class UploadedFile {
public string Filename
public UploadedFileData Data
}
public class UploadedFileData {
public byte[] Data
}
投影したい「データモデル」クラスは次のとおりです。
public class EmailDataModel {
public string Subject
public List<EmailAttachmentDataModel> Attachments
}
public class EmailAttachmentDataModel {
public string Filename
public byte[] Data
}
これらのモデルが非常によく似ていることがわかったので、「何がポイントなの?」と考えても仕方ありませんが、それは単純化したからです。ドメイン オブジェクトを便利なデータ モデルにフラット化できると便利です。
私の大きな問題は、子オブジェクト (この場合は UploadedFile.Filename と UploadedFileData.Data) の深いところから必要なフィールドにアクセスし、それらを EmailAttachmentDataModel コレクションとして EmailDataModel に投影する方法を見つけることです。
EmailCriteria.CreateAlias または EmailCriteria.CreateQuery のいずれかを使用して、子コレクションへのアクセスについて説明しているオンラインの記事をたくさん読みましたが、子コレクションをコレクションとして投影する方法を説明するものは見つかりませんでした。
これが、NH Criteria クエリをいじることに興味のある人にとって、役に立つ演習になることを願っています。