I have the classic situation Orders/OrderLines. I wanted to fetch some orders and eagerly load the orderslines with an outer join. I have noticed that if I use QueryOver:
var orders2 = session.QueryOver<Domain.Order>()
.Where(x => x.Company == "HBP00").And(x => x.Number == "VI11001680")
.Fetch(x => x.OrderLines).Eager
.List();
I get a cartesian product.
orders2 contains 11 rows even if there's just one order, but infact it has got 11 orderlines.
If I use Query:
var orders1 = session.Query<Domain.Order>()
.Where(x => x.Company == "HBP00" && x.Number == "VI11001680")
.Fetch(x => x.OrderLines)
.ToList();
everything works properly.
The funny thing is I've analyzed the query and they're identical.
Is there anything I have to know not to get a cartesian product eagerly loading a collection with QueryOver
?
I've found a solution reading this blog.
Apparently, you need .TransformUsing(Transformers.DistinctRootEntity)
with CreateQuery, CreateCriteria or QueryOver but you do not need it with Query.
Here's how I fixed it:
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();