我有实体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();
答案 0 :(得分:1)
LINQ to NHibernate非常适合简单易用的查询。但是,当您需要执行复杂查询(例如此查询)时,通常最好切换到条件API或HQL。您可以使用3种查询方法,全部使用它们。
有人说,一旦NHibernate 3.0发布,就可以使用LINQ进行此查询。
答案 1 :(得分:1)
你无法使用LINQ to NHibernate 2.x