Как использовать проекции со ссылками? - PullRequest
0 голосов
/ 25 мая 2011

У меня есть отображение, которое имеет две ссылки на два других отображения.

Во-первых, я бы создал подкритерии или псевдонимы?

Итак, у меня есть:

Base.Property1 Base.Property2 Base.Reference1.Property1 Base.Reference1.Property2 Base.Reference2.Property1 Base.Reference2.Property2

Я хочу спроецировать свой запрос натолько эти 6 свойств.

Мне удалось использовать проекции для запроса только для одной таблицы, но у меня возникают трудности, когда дело касается нескольких таблиц.

я бы сделал что-то вроде (для каждой ссылки): criteria.CreateCrtieria(bla) .SetProjection(Projections.ProjectionList() .Add(/*Add projections*/)) .SetResultTransformer(Transformers.AliasToBean(type));

Или просто создайте псевдонимы и получите прогнозы по исходным критериям, например, так:

criteria.CreateAlias("reference1", "r1").CreateAlias("reference2", "r2") .SetProjection(Projections.ProjectionList() .Add(Projections.Property("baseProperty1") .Add(Projections.Property("r1.property1") .Add(Projections.Property("r2.property2")) /*etc*/ .SetResultTransformer(Transformers.AliasToBean(baseType));

Я не знаю, еслипредыдущие две идеи на самом деле работают - кажется, они не работают, но я не знаю, потому ли, что я что-то забыл или они совершенно не в том духе.

Спасибо.

Ответы [ 2 ]

1 голос
/ 25 мая 2011

Использование методов CreateAlias ​​в Criteria API позволяет присоединяться к ссылочным объектам и позволяет проектировать свойства.

Каждому ссылочному типу вы присваиваете псевдоним , который вызатем используйте для доступа к свойствам ссылочных объектов.

Также имейте в виду, что вам необходимо убедиться, что имена свойств объекта, на который вы проецируете, точно совпадают в списке проекций.

Вы также можете указать JoinType в методах CreateAlias, если хотите использовать InnerJoin вместо LeftJoin.

var query = session.CreateCriteria<Base>()
             .CreateAlias("Base.Reference1","ref1")
             .CreateAlias("Base.Reference2","ref2")
             .SetProjection(
               Projections.ProjectionList()
               .Add(Projections.Property("Base.BaseProperty"),"DtoBaseProperty")
               .Add(Projections.Property("ref1.property1"),"DtoProperty1")
               .Add(Projections.Property("ref2.property2"),"DtoProperty2")
             )
             .SetResultTransFormer(Transformers.AliasToBean(typeof(ProjectionDto)))
             .List<ProjectionDto>();

public class ProjectionDto{
    public string DtoBaseProperty;
    public string DtoProperty1;
    public string DtoProperty2;
}
0 голосов
/ 26 мая 2011

Мое решение закончилось тем, что мне пришлось написать новый Трансформер. Я не собираюсь вставлять код, потому что он довольно длинный и довольно хакерский. Но для всех, кто заинтересован:

Вместо того, чтобы делать .Add(Projections.Property("r1.property1")

Я сделал .Add(Projections.Property("r1.property1"), "SubType.Property1")

Затем в преобразователе псевдоним "SubType.Property1" имеет значение кортежа, связанное с ним. Я разделяю псевдоним и создаю SubType, и для всех связанных с ним псевдонимов делаю то же, что и существующий преобразователь (присваиваю значения этим свойствам этого типа), а затем, наконец, устанавливаю объект подтипа как значение недвижимость по базовому типу.

Вероятно, это полностью противоречит концепции проекций, но она работает и работает довольно хорошо, учитывая, что она была взломана за пару часов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...