使用nHibernate和QueryOver如何加入3个表

时间:2011-08-17 05:06:07

标签: nhibernate fluent-nhibernate queryover

背景 给出3个表

results contains 2 columns vId and pId  
vTable contains 2 columns vId and data  
pTable contains 2 columns pId and data  

我想使用QueryOver

完成这种SQL查询
SELECT v.data, p.data  
from results r  
inner join vTable v on r.vId = v.vId   
inner join pTable p on r.pId = p.pId  

我尝试了以下内容:

var res = GetResults(some parameters)
            .Select(x => x.vId
            .Select(x => x.pID);

var dataset = session.QueryOver<vTable>()
                .WithSubquery.WhereProperty(v => v.vId).In(res)
                .Select(v => v.vId)
                .Select(v => v.data)

可以很好地从vTable

获取数据

然而,当我添加第二个表

var dataset = session.QueryOver<vTable>()
                .WithSubquery.WhereProperty(v => v.vId).In(res)
                .JoinQueryOver<pTable>(p => p.pId)
                .WithSubquery.WhereProperty(p => p.pId).In(res)
                .Select(v => v.vId)
                .Select(v => v.data)
                .Select(p => p.pId)
                .Select(p => p.data)

我收到错误

Delegate 'System.Func<System.Collections.Generic.IEnumerable<pTable>>' does not take 1 arguments

我做错了什么?

1 个答案:

答案 0 :(得分:2)

.JoinQueryOver<pTable>(p => p.pId)

必须指向映射的实体或集合而不是id,如果你不能在hbm中映射它。并且JoinQueryOver将返回pTables而不是vTables,如果你想将返回类型保留为vTable列表,你可能想要使用JoinAlias,但如果你想要的只是投影,请确保添加别名QueryOver和JoinQueryOver调用