Упорядочить и сгруппировать в NHibernate QueryOver - PullRequest
2 голосов
/ 17 марта 2012
var data = session.QueryOver<Product>()
                  .JoinAlias(qp => qp.FieldValues, () => qfv)
                  .UnderlyingCriteria.SetProjection(
                      Projections.Group(() => qfv.Product))
                  .AddOrder(Order.Asc("Price"))
                  .List<Product>();

Я получаю ошибку:

"Цена не может появляться в предложении OrderBy, поскольку она не содержится ни в агрегатной функции, ни в предложении группировки по группам".

Как видите, я группирую по "всему продукту" и не могу сделать то, что говорит ошибка. Я не могу группировать по цене (потому что товары будут отсутствовать, если они имеют одинаковую цену), и я не могу сделать MIN, MAX (цену) по той же причине, что и некоторые товары. Как я могу обойти это?

Ответы [ 3 ]

7 голосов
/ 18 марта 2012

Диего прав, группа по продукту есть группа по Product.Id. Если вы группируете по Product.Price, вы не пропустите ни одного продукта, потому что вы также сгруппировали его по Product.Id.

Вы можете сделать это, но не забывайте, что у вас есть только Product.Id и Product.Price:

var data = session.QueryOver<Product>()
                  .JoinAlias(qp => qp.FieldValues, () => qfv)
                  .SelectList(list => list
                    .SelectGroup(product => product.Id)
                    .SelectGroup(product => product.Price))
                  .OrderBy(product => product.Price).Asc
                  .List<object[]>();

Или вы можете сделать это без какой-либо группы: (Если вы хотите отсортировать только по продукту. Цена)

var data = session.QueryOver<Product>()
                  .JoinAlias(qp => qp.FieldValues, () => qfv)
                  .OrderBy(product => product.Price).Asc
                  .List<Product>();
1 голос
/ 18 марта 2012

Проблема в том, что это предположение неверно:

Как видите, я группирую по "всему продукту"

Когда вы группируете по Product, на самом деле происходит группировка по идентификатору продукта.

1 голос
/ 18 марта 2012

Может быть это или это поможет вам понять, что происходит за кулисами. Но все равно будет приятно увидеть сгенерированный код SQL или какое-либо отображение nHibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...