2011-05-20 42 views
3

Ive得到了我的查詢與QueryOver API構建的......現在的問題是,我需要通過需要在飛行中被calculeted一些特殊的價值排序它...不平凡的順序由QueryOver查詢

我有我的產品表,我需要從一些特定的座標的距離排序它..等效於SQL將看起來像ORDER BY power(abs(p.x - @x),2) + power(abs(p.y - @y),2)

現在我不知道如何在QueryOver查詢中寫它..任何建議?

我會很高興的任何幫助!

回答

4

使用QueryOver這有點問題,因爲我們在使用SQL函數時需要使用Projections。

我放棄了abs(...),因爲它時並不需要,因爲x * x == -x * -x

選項1:使用SqlProjection(不漂亮,但更短)

int x = 10; 
int y = 20; 

var result = session.QueryOver<Product>() 
    .OrderBy(Projections.SqlProjection(
     @"power(x - " + x.ToString() + ", 2) + power(y - " + y.ToString() + ", 2) as tmporder", 
     new string[] { "test" }, 
     new NHibernate.Type.IType[] { NHibernateUtil.Int32 })).Asc 
    .List(); 

選項2:使用SqlFunction - 這是長並需要看看下面的鏈接:

這樣的事情(你需要包括從鏈接OperatorProjection;它不完整,我沒有測試它)

.OrderBy(Projections.SqlFunction("power", NHibernateUtil.Double, 
    new ArithmeticOperatorProjection("+", NHibernateUtil.Int32, 
     Projections.Property<Product>(p => p.x), Projections.Constant(x)), 
    Projections.Constant(2))).Asc 

NHibernate and the missing OperatorProjection Part 1

+0

可悲的是,我得到'當前方言NHibernate.Dialect.MsSql2008Dialect不支持的功能:power' ..有什麼解決辦法或我要使它成爲一個*一個? – 2011-05-23 15:04:34

+0

@ŁukaszW.pl這很奇怪。我使用SQL 2008數據庫和NH 3.1測試了選項1,它沒有給出錯誤警告。你使用的是什麼版本的NHibernate? – 2011-05-24 10:04:10

+0

最新的可能,但不要擔心..我的工作周圍..感謝您的幫助;) – 2011-06-01 12:31:06