2017-03-15 97 views
0

我使用LINQ to SQL代碼生成器來生成從SQL Server表讀取GUID的簡單數據上下文,並使用如下所示的簡單LINQ調用來訪問讀取的GUID:LINQ to SQL中的InvalidCastException

dataContext.MyTable.FirstOrDefault(x => x.ID.Equals(id)) 

在大多數情況下,這種通話效果很好,但我很少得到一個錯誤,如以下錯誤:

System.InvalidCastException: Unable to cast object of type '<>c__DisplayClass356' to type 'System.Func`1[System.Guid]' 

任何人都可以請建議什麼可能導致這個錯誤,爲什麼這個錯誤不會發生每次?

謝謝。

+3

錯誤與您所查詢的錯誤不符給我們看。錯誤發生在其他地方。它描述了一個只返回一個'Guid'的函數。你的函數需要一個對象並返回一個'bool'。 – Rob

+0

這裏'id'的價值是什麼?你將什麼查詢的結果分配給? – DavidG

+0

你是如何得到id –

回答

0

試試這個

dataContext.MyTable.FirstOrDefault(x => x.ID.ToString() == id.ToString()); 
0

顯然類MyTableSystem.Guid類型的屬性ID

您不指定id的類型。由於您的錯誤報告,它不是Guid。由於它經常起作用,我認爲它可以很容易地被解析爲Guid,就像一個字符串。難道有時候,字符串ID不代表正確的Guid

別人給不工作的解決方案:

var myTable = dataContext.MyTable.First(); // assume not empty 
Guid myGuid = myTable.ID;     // assume not empty 
string id = myGuid.ToString("X"); 

// The solution suggested by others does not find the element: 
Guid foundGuid = dataContext.MyTable.FirstOrDefault(x => x.ID.ToString() == id.ToString()); 

原因:myGuid.ToString()的結果是不同的字符串,雖然ID是myGuid串好的表現,這不等於myGuid.ToString ()

下面的代碼一定會找到的元素:

Guid idGuid = Guid.Parse(id); 
Debug.Assert(myGuid.Equals(idGuid); 
Guid foundGuid = dataContext.MyTable.FirstOrDefault(x => x.ID.Equals(idGuid)); 

如果您不能確定該ID是一個適當的Guid,使用Guid.TryParse,在代替Guid.Parse如果它甚至沒有解析到正確的GUID,不要打擾開始您的LINQ聲明,因爲您確定它不在MyTable中