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

我得到錯誤:ORDER BY和集團在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 2012-03-17 19:08:42

回答

7

迭戈是正確的,按產品分組是由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

也許thisthis將幫助您瞭解幕後發生的事情。但是看到生成的SQL代碼或一些nHibernate映射仍然很好。

1

的問題是,這種假設是不正確的:

As you see I group by "the whole product"

當你按Product,實際發生的事情是,你組產品編號。