LINQ至NHibernate can';不要接触儿童';孩子们
我有一个实体A,它的IList为B,称为Bs,B的IList为C,称为Cs 我想搜索所有至少有5个C的A。所以我去写了LINQ至NHibernate can';不要接触儿童';孩子们,linq,nhibernate,fluent-nhibernate,mappings,Linq,Nhibernate,Fluent Nhibernate,Mappings,我有一个实体A,它的IList为B,称为Bs,B的IList为C,称为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
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();
}
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();
LINQ to NHibernate对于简化查询非常有用。然而,当您需要执行复杂的查询时(比如这个),最好切换到CriteriaAPI或HQL。您有3种查询方法可供使用,请全部使用
也就是说,一旦发布了NHibernate 3.0,就可以使用LINQ执行此查询。使用LINQ到NHibernate 2.x无法执行此查询。您可能需要在NHibernate主干中尝试较新的LINQ提供程序。NHContrib Linq提供程序的功能更为有限。我从NHibernate主干中获得了最新的Linq提供程序,但它并没有解决我的问题:(((())因此我知道,对于NHibernate的最新发布的Linq提供程序,这是不可能的。。
References(c => c.B, "IdB").Not.LazyLoad();