Как я могу получить коллекцию для члена DTO с помощью nhibernate? - PullRequest
2 голосов
/ 13 июля 2009

Мне нужно заполнить свойство коллекции в 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 делает не так (выбрасывает исключение). что здесь делать правильно?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2016

Вы можете использовать пользовательское преобразование.

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]
            };
        }
    }
0 голосов
/ 19 апреля 2011

Я получил свойства коллекции в моем проекте со следующим синтаксисом:

public IList<ChildCollectionType> GetChildObjectsByParentId(Int32 id)
{
    ISession session = GetSession();//Get NHibernate session routine
    return session.Load<ParentDTO>(id).ChildCollectionProperty;
}

где id - ключ родительского объекта.

...