2012-07-04 74 views
4
return queryable.Where(version => version.Id.ToString().Contains(searchKey)); 

此行將導致「ToString不支持異常」。LINQ to NHibernate - 比較guid與字符串

目標:創建搜索查詢,將比較字符串,int,GU​​ID和字符串關鍵字。

感謝您的任何幫助。

+0

您好,我更新了我的答案檢查其樂於助人的你或我不寫了可能會幫助你如何工作的說明...... –

回答

0

更好的方法來比較類似這樣的

return queryable. 
    Where(version => 
       (String.Compare(version.Id.ToString(),searchkey, true)==0); 

注:在這裏我考慮searchkey作爲字符串轉換ANC version.Id的GUID字符串,並使用String.Compare字符串和通過把字符串忽略大小寫在比較法真正

+0

ToString()不被支持,Equals()似乎也是如此。 –

+0

@YevhenMartynov - 嘗試updatea asnwer ... –

+0

System.NotSupportedException { 「的Int32比較(System.String,System.String,System.StringComparison)」} –

3

沒有測試過,但你可以嘗試查詢之前建立您的GUID的要被搜索的對象:

Guid searchGuid; 
try 
{ 
    searchGuid = Guid.Parse(searchKey); 
} 
catch (System.FormatException) 
{ 
    // Handle invalid search key 
} 

return queryable.Where(version => version.Id == searchGuid); 

編輯:

沒有測試(對不起,再次),但據我所知NHibernate.Linq是能夠翻譯類型轉換語句相當於SQL轉換函數。也許這應該工作:

return queryable.Where(version => (string)version.Id == searchGuid); 

雖然我不確定C#sintax。在VB.NET我會寫這樣的:

Return queryable.Where(Function(version) CType(version.Id,String) = searchGuid) 
+0

是的,這是我的計劃「B」,因爲GUID類型只有一種情況。 –

+0

「編輯」也不受支持。 System.String ToString(System.Object) –

+0

-1甚至提到「計劃B」。請把它拿出來,因爲它應該避免不惜一切代價,因爲你將失去索引。這是最糟糕的錯誤。 – Aron

1

你不能直接LINQ做(你不得不延長LINQ提供程序,這是不平凡)

是,然而,使用NHibernate所有其他查詢方法很容易。

下面是與QueryOver一個例子:

return session.QueryOver<YourEntity>() 
       .Where(Restrictions.Like(
         Projections.Cast(NHibernateUtil.String, 
              Projections.Property<YourEntity>(
               version => version.Id)), 
         searchKey, 
         MatchMode.Anywhere)) 
0

下面是框架4.5的答案至少...

Version Ver = null; 
    foreach (Version V in Versions) { 
     Guid g = V.ID; 
     if (string.Compare(g.Value.ToString(), searchkey)) { 
      Ver = V; 
      break; 
     } 
    } 

OR in LINQ 

Version Ver = Version.Where(v => v.ID.Value.ToString == searchkey).FirstOrDefault; 


    //Use found Ver ;-)