2011-01-20 49 views
3

我想爲了我的NHibernate的3.0 LINQ的動態查詢,基於存儲在一個字符串變量列名的NHibernate 3.0 Linq查詢。如何訂購根據提供的屬性名

// The value of this variable can be the name of any property of Document. 
string columnName = "column1"; 

var query = from n in Session.Query<Document>() 
      where n.DocumentNumber == documentNumber 
      // how to order by the value of columnName? 
      select n; 

orderby關鍵字確實接受字符串(或變量),但是當我執行以下命令:

var query = from n in Session.Query<Document>() 
      where n.DocumentNumber == documentNumber 
      orderby columnName 
      select n; 

我得到這個異常:

無法執行查詢

select TOP (@p0) 
    accumulate0_.Id as Id9_, 
    accumulate0_.DocumentNumber as Documen10_9_ 
from dbo.Documents accumulate0_ 
where 
    [email protected] 
order by @p2 desc 
由ORDER BY識別號碼

選擇項目包含一個變量作爲表達識別的列位置的部分 。只有在引用列名的表達式對 進行排序時,才允許使用變量。

我知道有這規定,接受字符串 .OrderBy extention方法的重載的 LINQ Dynamic Query Library但這顯然只是在內存 工作。但是,當使用NHibernate 3.0時會引發異常。

我試圖讓生成的SQL查詢中的ORDER BY語句具有指定的相應列名,所以我需要留在NHibernate領域。

使用NHibernate的標準,我可以動態訂單,但因爲我使用NHibernate LINQ中,我似乎沒有能夠訪問的標準功能。

回答

4

動態LINQ適用於任何來源,而不僅限於內存。

這就是我們現在正在使用的。

+0

所以我想我得到了錯誤的,那麼......但遺憾的是動態LINQ排序依據拋出異常(我不記得確切,這是前一陣子其中之一)使用NHibernate 3.0時,雖然在舊的沒有工作版本。 – 2011-01-21 08:52:57

1

但由於我使用的是NHibernate Linq,因此我似乎無法訪問 條件的功能。

當然會話。應該調出CreateCriteria? NHibernate Linq和CreateCriteria應該生活在一起更快樂。

不知道有沒有可能單獨使用LINQ,還我不認爲這是可能使用QueryOver只有一種解釋可能是使用個createCriteria正如你所指出。

var query = Session 
    .CreateCriteria<Document>() 
    .Add(Restrictions.Eq("DocumentNumber", documentNumber)) 
    .AddOrder(Order.Asc("column1")) 
    .List<Document>(); 

另一種方法是使用HQL。