nHibernate 3 - Решение Re-Linq для Left Join - PullRequest
11 голосов
/ 17 января 2011

Я пытаюсь выполнить этот запрос 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, не может поддерживать что-то столь же пешеходное, как левое соединение.

[править]

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

Ответы [ 2 ]

8 голосов
/ 16 мая 2012

После дальнейших исследований по этому вопросу;этого можно (хотя и не очевидно) добиться строго типизированным способом, используя QueryOver .Хитрость заключается в том, чтобы использовать внешние переменные псевдонима запроса в сочетании с 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>();
1 голос
/ 17 января 2011

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

...