急切地获取多个集合:QueryOver和Query之间的差异

时间:2011-08-05 15:20:14

标签: nhibernate linq-to-nhibernate queryover

我有经典情况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的收藏品吗?

1 个答案:

答案 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();