2012-11-27 33 views
4

我有以下代碼NHibernate的可查詢不允許字符串比較

var results = 
       repository.GetItemsAsQuery<User>().Where(
        user => user.EmailAddress.Equals(emailAddress, StringComparison.CurrentCultureIgnoreCase)); 

      return results.Any(); 

庫只是我周圍NHibernate會話的包裝和方法具有以下簽名

public IQueryable<T> GetItemsAsQuery<T>() 
     { 
      try 
      { 
       CheckHasErrored(); 

       return _connection.Session.Query<T>(); 
      } 
      catch (Exception ex) 
      { 
       HasErrored = true; 
       throw new DataRepositoryException(string.Format("Error getting collection of items of type '{0}'", typeof(T).Name), "DataRepository.GetItems<>", ex);   
      } 
     } 

當我運行的第一個方法,我得到了與源NHibernate的錯誤NotSupportException - 布爾等於(System.String,System.StringComparison)。

這似乎意味着該錯誤是從我試圖過濾的

user.EmailAddress.Equals(emailAddress, StringComparison.CurrentCultureIgnoreCase) 

NHibernate的查詢LINQ lambda表達式我使用NHibernate的可查詢的錯誤來了嗎?我想要它生成的等效SQL是

select * from User where emailAddress = @emailAddress 

因此,我只在數據網絡中返回一行。

+0

我不確定你使用的是什麼數據庫。默認情況下,SQL Server中的文本比較不區分大小寫,在這種情況下,可以使用標準的'=='或'.Equals(string)'。 –

回答

1

LINQ還不是100%與Nhibernate兼容。請嘗試使用String.Compare(string a, string b)代替。

+0

仍然得到System.NotSupportedException:Int32 Compare(System.String,System.String) – NZJames

4

我看到你的問題/你想要的兩大問題:

  • 你想要的SQL查詢與您的字符串比較方法不兼容。當比較「StRiNg」和「string」時,你的字符串比較方法會返回true,因爲它忽略了字符串的大小寫,而你的SQL查詢在比較這些字符串時會返回false。如果你想忽略比較時的情況下,你應該將查詢更改爲:

repository.GetItemsAsQuery(),其中( 用戶=> user.EmailAddress.ToLower()== emailAddress.ToLower());

如果我沒有弄錯,這已經可以與NHibernate。

  • 你的下一個大問題是試圖在你的SQL查詢中進行文化意識比較。這在NHibernate中尚不可行。如果你想要文化意識的字符串比較SQL查詢,你將不得不用普通的SQL編寫這些查詢。但是,對於簡單的平等比較,您可能不會遇到任何問題:只需使用==運算符進行字符串比較,您就可以做得很好。

希望它有幫助!

2

String.Compare現在支持NHibernate