1

我有一个实体 A,它有一个名为 Bs 的 B 的 IList,B 有一个名为 Cs 的 C 的 IList。

我想搜索其中至少有 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: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();
4

2 回答 2

1

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

话虽如此,一旦 NHibernate 3.0 发布,就有可能使用 LINQ 进行此查询。

于 2010-02-05T15:10:40.477 回答
1

你不能用 LINQ to NHibernate 2.x 做到这一点

于 2010-02-11T14:14:34.490 回答