2012-02-20 39 views
2

我想通過一個GUID作爲一個字符串通過web服務,但是我在路上碰到了一個凹凸。 GUID作爲UNIQUEIDENTIFIER存儲在SQL Server中,EF將其作爲GUID進行提取。我希望做的是我的查詢做到這一點:轉換guid到實體框架的字符串

var query = myEntities.Foo.Where(q => q.Id== Id) 
       .Select(bar => 
         new Bar() 
          { BString = bar.GUID } 
         ); 

現在,C#拋出,你不能轉換System.Guidstring生成錯誤,所以我認爲你可以這樣做:

{ BString = bar.GUID.ToString() } 

甚至

{ BString = Convert.ToString(bar.GUID) } 

但兩端與運行時異常:

有一個例外,它是System.NotSupportedException:LINQ到 實體無法識別方法'System.String ToString(System.Object)'方法,並且此方法不能將 轉換爲存儲表達式。

所以我推測,在這兩種情況下,它不能夠找出一個T-SQL相當於去從UniqueIdentifiervarchar

除了檢索對象,然後遍歷我的返回集,將每個對象複製到一個新的對象並在那一點轉換guid->字符串,是否有解決方法?

謝謝。

+0

這裏有一個解決方法。讓你的bar類型有一個屬性返回它的Guid作爲字符串,然後在你的Linq查詢中使用這個屬性 – Beatles1692 2012-02-20 15:46:20

+0

lambda語句執行後查詢的值是什麼。 – MethodMan 2012-02-20 15:47:04

回答

6

將其轉換爲字符串的LINQ語句的查詢部分。

var query = myEntities.Foo.Where(q => q.Id== Id).Select(r => r.GUID) 
    .AsEnumerable() 
    .Select(guid => 
    new Bar() 
    { BString = guid.ToString() } 
); 

.AsEnumerable()是重要的部分:它施放的結果從IQueryableIEnumerable,具有客戶機上運行的任何進一步的操作數據庫查詢作出後的效果。 (你也可以在它的地方使用.ToArray().ToList()。)

+0

謝謝,我將使用第二個查詢,直到我有機會進行性能測試。否則,我可能不得不交換到類似像Zruty那樣的存儲。 – Dio 2012-02-20 16:04:02

0

如果性能是不是一個問題,你應該你的GUID手動重新映射到字符串,如你所說自己:

var query = from entity in myEntities.Foo 
      where entity.Id == Id 
      select new { GUID = entity.GUID }; 
var response = from item in query.ToList() 
       select new Bar { BString = item.GUID } 

這類似於@Tim Rogers所建議的,但明確地分爲兩個查詢。

我想到的另一個選擇是編寫一個存儲過程,使用T-SQL的原生convert()語句將GUID轉換爲字符串。這將解決EF無法自動將GUID映射到字符串的問題。