Как я могу получить коллекцию для члена DTO с помощью nhibernate?

2

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

  • 0
    Я думаю, что вы пытаетесь сделать один-ко-многим, что должно быть сделано в вашем отображении, но я не совсем уверен. Можете ли вы опубликовать свои файлы сопоставления?
  • 0
    Я делаю один-ко-многим, и мои сопоставленные сущности хорошо работают для такого рода вещей, но я не хочу возвращать свою сопоставленную сущность, я хочу DTO со множеством свойств, а что-то, что не является специфичным для вид, что они будут использованы на.
Теги:
orm
nhibernate
dto

2 ответа

0

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

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

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

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

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

  • 0
    Извините, я не правильно прочитал ваш оригинальный вопрос. Я не осознавал, что вы пытаетесь заполнить пользовательское DTO свойством коллекции. Здесь есть еще несколько постов с людьми, имеющими проблемы с aliasToBean, например stackoverflow.com/questions/4504054/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню