我正在使用 NH Criteria 检索实体并将选择性字段投影到自定义类上(有点像将数据投影到 ViewModel 上以在 MVC 视图上显示)。
这很容易使用 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 查询的人来说都是一个有用的练习。