Используя nHibernate и QueryOver, как я могу объединить 3 таблицы - PullRequest
1 голос
/ 17 августа 2011

ФОН: Дано 3 таблицы

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

Я хочу выполнить такой запрос SQL, используя QueryOver

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

однако, когда я добавляю 2-ю таблицу

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 Ответ

2 голосов
/ 18 августа 2011
.JoinQueryOver<pTable>(p => p.pId)

должен указывать на сопоставленную сущность или коллекцию, а не на ее идентификатор, если вы не можете отобразить его в hbm.Кроме того, JoinQueryOver будет возвращать pTables, а не vTables, вы можете вместо этого использовать JoinAlias, если хотите сохранить тип возвращаемого значения в качестве списка vTables, но если вам нужна только эта проекция, убедитесь, что вы добавили псевдонимы вызовов QueryOver и JoinQueryOver.

...