LINQ to NHibernate не может добраться до детей детей - PullRequest
1 голос
/ 28 января 2010

У меня есть объект A, у которого есть IList из B под названием Bs, а у B есть IList из C, который называется Cs.

Я хочу найти все А, которые имеют по крайней мере 5 С. Поэтому я пошел и написал

using (var s = this._sessionFactory.OpenSession())
{
    IQueryable<A> q = s.Linq<A>();
    // some code...
    if (range.Min.HasValue)                    
        q = q.Where(a => a.Bs.Sum(b => b.Cs.Count) >= range.Min.Value);
    // some code...
    return q.Select(b=>b).ToArray();
 }

Однако, выполнив код (и указав Min в переменной диапазона), я получаю следующее исключение:

NHibernate.QueryException: не удалось разрешить свойство: Cs of: A

Почему он ищет свойство B на A? Тем не менее, сопоставления кажутся правильными:

(Свободное) отображение на A говорит:

//...
HasMany(a => a.Bs)
 .Table("Bs")
 .KeyColumn("IdA")
 .Cascade.AllDeleteOrphan()
 .Inverse()
 .Not.LazyLoad();
//...

и на картине B говорит:

//...
HasMany(b => b.Cs)
 .Table("Cs")
 .KeyColumn("IdB")
 .Cascade.AllDeleteOrphan()
 .Inverse()
 .Not.LazyLoad();
References(b => b.A, "IdA")
 .Not.LazyLoad();
//...

наконец, отображение на C:

References(c => c.B, "IdB").Not.LazyLoad();

Ответы [ 2 ]

1 голос
/ 11 февраля 2010

Вы не можете сделать это с LINQ to NHibernate 2.x

1 голос
/ 05 февраля 2010

LINQ to NHibernate отлично подходит для простых запросов. Однако, когда вам нужно выполнить сложные запросы (такие как этот), часто лучше переключиться на API критериев или HQL. У вас есть 3 метода запроса, используйте их все.

Как говорится, после выпуска NHibernate 3.0 этот запрос можно выполнить с помощью LINQ.

...