2017-03-15 102 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中