我试图使用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不能支持像左边连接这样的行人。
[编辑]
我在下面给出了我自己的问题的真实答案。
答案 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是您目前唯一的选择。