我正在处理N + 1问题,我想在特定查询中急切加载一个集合,但是我得到了“懒得初始化集合”错误,或者查询保持延迟加载。
我已经尝试过很多由stackmembers提供的建议,但都没有。
我的实体示例:
public class Bar
{
private _IList<Foo> _fooList;
public IEnumerable<Foo> FooList {get{return _fooList;} }
}
地图示例:
HasMany(d => d.FooList)
.Access.CamelCaseField(Prefix.Underscore)
.KeyColumn("IdBar")
.Cascade.AllDeleteOrphan()
.Inverse();
抛出错误的查询(未能懒惰地初始化集合):
var test = GetSession().Query<Bar>()
.Fetch(b => b.FooList);
IList<Bar> bars= GetSession().QueryOver<Bar>()
.Fetch(d => d.FooList).Eager
.List();
查询仍然存在N + 1问题:
IList<Bar> bars= GetSession().QueryOver<Bar>()
.Fetch(d => d.FooList).Eager
.JoinQueryOver<Foo>(d => d.FooList)
.Where(f => f.Active).List<Bar>();
Foo fooAlias = null;
IList<Bar> bars= GetSession().QueryOver<Bar>()
.Fetch(d => d.FooList).Eager
.JoinAlias(d => d.FooList, () => fooAlias)
.List();
我需要帮助解决这个N + 1问题,渴望加载FooList集合。
答案 0 :(得分:0)
您是否使用过HQL以及... LEFT JOIN FETCH ...
?它也提供了相同的问题吗?
答案 1 :(得分:0)
映射应该使用
.Access.ReadOnlyPropertyThroughCamelCaseField
代替。