Я использую 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.