Мне нужно получить свойство коллекции, заполненное DTO, и у меня возникли проблемы с поиском какой-либо информации об этом.
Я попытался сделать это вот так:
ICriteria selectCriteria = Session.CreateCriteria<DataRun>()
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("SomeCollection"), "Collection"))
.SetResultTransformer(Transformers.AliasToBean<MyDto>());
но MyDto.Collection всегда равен нулю. Я делаю это неправильно, возможно ли это?
Кроме того, я изначально планировал сделать это с помощью SubQuery, чтобы я мог просто заполнить свою коллекцию DTO другими DTO, но это не сработает, потому что результат подзапроса имеет более 1 строки (как и должно быть), а Sqlit не так (выбрасывает исключение). что можно сделать здесь?
Вы можете использовать настраиваемое преобразование.
ICriteria selectCriteria = Session.CreateCriteria<DataRun>()
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("SomeCollection"), "Collection"))
.TransformUsing(new CustomTransformer());
Вот ваша пользовательская реализация трансформатора
public class CustomTransformer : IResultTransformer
{
public System.Collections.IList TransformList(System.Collections.IList collection)
{
return collection;
}
public object TransformTuple(object[] tuple, string[] aliases)
{
return new MyDto
{
//map your data to dto and convert to data type if needed
YourProperty1 = tuple[0],
YourProperty12 = (int)tuple[1]
};
}
}
Я получил свойства коллекции в моем проекте со следующим синтаксисом:
public IList<ChildCollectionType> GetChildObjectsByParentId(Int32 id)
{
ISession session = GetSession();//Get NHibernate session routine
return session.Load<ParentDTO>(id).ChildCollectionProperty;
}
где id - это ключ родительского объекта.