Стремительно выбирайте несколько коллекций: различия между QueryOver и Query - PullRequest
1 голос
/ 05 августа 2011

У меня классическая ситуация 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 Ответ

4 голосов
/ 08 августа 2011

Я нашел решение, читающее этот блог .

Очевидно, вам нужно .TransformUsing(Transformers.DistinctRootEntity) с CreateQuery, CreateCriteria или QueryOver, но вам не нужно с Query.

Вот как я это исправил:

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();
...