2012-06-08 2 views
3

Я использую NHibernate в первый раз, и в этой линии он бросает исключение для меняне может разрешить свойство: ИмениСвойства из: ошибки класса в NHibernate

var total = session 
        .QueryOver<Comment>().Where(p => p.Entry.Author == username) 
        .ToRowCountQuery() 
        .FutureValue<int>(); 

       var results = session 
        .QueryOver<Comment>().Where(p => p.Entry.Author == username) 
        .Fetch(x => x.Entry).Eager() 
        .OrderBy(x => x.Posted).Desc() 
        .Skip(skip) 
        .Take(take) 
        .List(); 

Исключение составляет

не может решить свойство: Entry.Author из: FunnelWeb.Model.Comment

Я думаю, проблема в том, что Entry объект не загружен здесь. Как я могу сделать этот трюк с Nhibernate?

+2

Вы могли бы разместить hbm (или другое сопоставление) для комментариев? –

ответ

5

QueryOver - это строго типизированная оболочка для критериев и не допускает неявных глубоких ссылок.

Вы должны были бы использовать:

session.QueryOver<Comment>() 
     .JoinQueryOver(x => x.Entry) 
     .Where(x => x.Author == username) 

Или вы можете использовать вместо Query<> (LINQ), который будет работать с синтаксисом вы пробовали.

2

Вам понадобится JoinAlias ​​или JoinQueryOver. У меня есть пример ниже о том, как использовать будущие запросы ...

Entry entryAlias = null; 

var q = session.QueryOver<Comment>() 
    .JoinAlias(x => x.Entry,() => entryAlias) 
    .Where(() => entryAlias.Author == username); 

var totalFuture = q.ToRowCountQuery().FutureValue<int>(); //ToRowcountQuery clones the query, we can reuse it for results 

var resultsFuture = q 
    //.Fetch(x => x.Entry).Eager() //already joined 
    .OrderBy(x => x.Posted).Desc() 
    .Skip(skip) 
    .Take(take) 
    .Future<Comment>(); 

var results = resultsFuture.ToList(); //both future queries are executed in the same batch 
var total = totalFuture.Value; 
Смежные вопросы