我有经典情况Orders / OrderLines。 我想获取一些订单,并急切地通过外部联接加载订单行。 我注意到如果我使用QueryOver:
var orders2 = session.QueryOver<Domain.Order>()
.Where(x => x.Company == "HBP00").And(x => x.Number == "VI11001680")
.Fetch(x => x.OrderLines).Eager
.List();
我得到了笛卡尔积。
orders2 包含11行,即使只有一个订单,但实际上它有11个订单。
如果我使用Query:
var orders1 = session.Query<Domain.Order>()
.Where(x => x.Company == "HBP00" && x.Number == "VI11001680")
.Fetch(x => x.OrderLines)
.ToList();
一切正常。
有趣的是我已经分析了查询,它们是完全相同的。
有什么我不得不知道不要让笛卡尔产品急切地加载QueryOver
的收藏品吗?
答案 0 :(得分:4)
我找到了一个解决方案this blog。
显然,您需要使用CreateQuery,CreateCriteria或QueryOver .TransformUsing(Transformers.DistinctRootEntity)
,但查询时不需要它。
以下是我修复它的方法:
var orders2 = session.QueryOver<Domain.Order>()
.Where(x => x.Company == "HBP00").And(x => x.Number == "VI11001680")
.Fetch(x => x.OrderLines).Eager
.TransformUsing(Transformers.DistinctRootEntity)
.List();