Подтвердить что ты не робот

NHibernate 3 - Left Присоединить решение re-Linq

Я пытаюсь запустить этот запрос Linq ниже с nHibernate 3.

var items = from c in session.Query<tbla>()
       join t in session.Query<tblb>() on c.Id equals t.SomeId into t1 // use left join on trades.
       from t2 in t1.DefaultIfEmpty()
select new {item = c, desc = t2.Description};

Это запасной способ выполнения левого соединения в linq, насколько мне известно. Однако это дает мне неподдерживаемое сообщение об исключении. Как я могу достичь базового левого соединения, не обращаясь к HQL? Это кажется несколько глупым, что ORM, как распространенный как nHibernate, не может поддерживать что-то пешеходным как левое соединение.

[править]

Я поставил реальный ответ на свой вопрос ниже.

4b9b3361

Ответ 1

После дальнейших исследований по этому поводу; это возможно (хотя и не очевидно) для достижения строго типизированного способа, используя QueryOver. Хитрость заключается в использовании внешних переменных псевдонимов Query в сочетании с WithAlias ​​и TransformUsing. Вот пример, который делает левое соединение с фильтрацией и сортировкой.

// Query alias variables 
entityTypeA anchorType = null;
entityTypeB joinedType = null;

var items = session.Query<entityTypeA>( ()=>anchorType )
            .Left.JoinAlias(() => anchorType.FieldName, () => joinedType)
            .WithSubquery.WhereProperty(e => e.FieldD).In(myFilterList)
            // bind property mappings using WithAlias
            .SelectList(list => list
                        .Select(e => e.FieldNameA).WithAlias( ()=> anchorType.FieldNameA )
                        .Select(e => e.FieldNameB).WithAlias( ()=> anchorType.FieldNameB )
                        )
           .OrderBy(e => joinedType.FieldNameC).Desc
           .TransformUsing(Transformers.AliasToBean<entityTypeA>()) // transform result to desired type.
           .List<entityTypeA>();

Ответ 2

Он еще не поддерживается. HQL - ваш единственный выбор на данный момент.