2011-04-09 88 views
1

我一直在努力解決這個問題很長時間,我無法正常工作。我想要做的是獲得比指定條目早的日期條目。爲了您的理解,我將向您展示以下代碼片段:爲什麼Nhibernate.Linq引發異常「方法Compareto未實現」?

 var post = _session.Linq<PostModel>() 
      .Where(o => o.PostId == id) 
      .FirstOrDefault(); 

     return _session.Linq<PostModel>() 
      .Where(o => DateTime.Compare(post.PostDate, o.PostDate) >= 0) 
      .ToList(); 

這不行!它將把我一個異常說:

The method Compareto is not implemented. 

我已經試過落實「的IComparer」我PostModel,但這似乎不是在這裏是問題。雖然,這將工作,如果我第一次所有條目轉換到一個列表,然後對它們進行比較,就像這樣:

 return _session.Linq<PostModel>().ToList() 
      .Where(o => DateTime.Compare(post.PostDate, o.PostDate) >= 0) 
      .ToList() 

但我的理解,在任何情況下將所有條目列表,會引起NHibernate的選擇所有條目。如果我們談論少量的參賽作品,這可能不成問題,但從長遠來看,這會浪費一些時間。

有沒有人有任何想法?

TIA

回答

3

問題是,NHibernate linq提供程序需要將調用轉換爲DateTime.Compare爲SQL,以便它可以在服務器上執行。由於錯誤狀態,這並沒有得到落實,雖然你可能能夠查詢更改爲:

_session.Linq<PostModel>() 
      .Where(o => post.PostDate >= o.PostDate) 
      .ToList(); 

這將可能實現。

+0

我不能相信我之前沒想到的是..謝謝你這麼多! – 2011-04-09 14:23:00

2

只是一個猜測,但它可能不喜歡你的原因靜態調用。也許只是嘗試使用內置的關係運算符的日期時間是這樣的:

.Where(o => o.PostDate >= post.PostDate) 

我想想想你的版本轉換爲SQL,我看不出他們怎麼會知道做到這一點,即使所有的黑魔法NHibernate的確。

2

李有它一觸即發。 NHibernate LINQ提供者沒有辦法將方法調用轉換爲SQL,這就是拋出NotImplementedException的原因。您可以提供NHibernate的一個辦法,通過翻譯NHibernate的LINQ提供程序擴展模型此調用到SQL:

http://fabiomaulo.blogspot.com/2010/07/nhibernate-linq-provider-extension.html

+0

非常聰明的實現,我會看看那個。感謝您的鏈接! – 2011-04-09 20:10:08

相關問題