2012-03-17 1 views
2
var data = session.QueryOver<Product>() 
        .JoinAlias(qp => qp.FieldValues,() => qfv) 
        .UnderlyingCriteria.SetProjection(
         Projections.Group(() => qfv.Product)) 
        .AddOrder(Order.Asc("Price")) 
        .List<Product>(); 

Я получаю сообщение об ошибке:Сортировки и Группа в NHibernate QueryOver

"Price cannot appear in OrderBy clause because it is not contained in either and aggregate function or in a group by clause".

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

+0

Я не понимаю вопрос, что создается SQL, который создается? – Rippo

ответ

7

Diego is right, group by Продукт представляет собой группу по 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

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

1

Проблема заключается в том, что это предположение неверно:

As you see I group by "the whole product"

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

Смежные вопросы