LINQ to NHibernate无法接触到孩子的孩子

时间:2010-01-28 11:07:39

标签: linq nhibernate fluent-nhibernate mappings

我有实体A,其中一个B的IList叫Bs,而B有一个C的IList叫做Cs。

我想搜索其中至少有5个C的所有A。所以我去写了

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

为什么在A上寻找B的属性?这些映射似乎是正确的:

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 个答案:

答案 0 :(得分:1)

LINQ to NHibernate非常适合简单易用的查询。但是,当您需要执行复杂查询(例如此查询)时,通常最好切换到条件API或HQL。您可以使用3种查询方法,全部使用它们。

有人说,一旦NHibernate 3.0发布,就可以使用LINQ进行此查询。

答案 1 :(得分:1)

你无法使用LINQ to NHibernate 2.x