nHibernate 3 - 左连接重新Linq解决方案

时间:2011-01-16 21:03:51

标签: linq nhibernate left-join

我试图使用nHibernate 3运行下面的Linq查询。

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的情况下实现基本的左连接?这似乎有点愚蠢,像nHibernate这样流行的ORM不能支持像左边连接这样的行人。

[编辑]

我在下面给出了我自己的问题的真实答案。

2 个答案:

答案 0 :(得分:8)

经过进一步的研究;使用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>();

答案 1 :(得分:1)

尚未支持。 HQL是您目前唯一的选择。