Вопрос

У меня есть объект 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 из:А

Почему он ищет собственность 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

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

Другие советы

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

При этом после выхода NHibernate 3.0 этот запрос можно будет выполнить с помощью LINQ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top