我使用LINQ to SQL代码生成器生成一个从SQL Server表中读取GUID的简单数据上下文,并使用简单的LINQ调用访问读取GUID,如下所示:
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]'
有人可以建议可能导致此错误的原因以及每次都不会发生此错误的原因吗?
谢谢。
答案 0 :(得分:0)
试试这个
dataContext.MyTable.FirstOrDefault(x => x.ID.ToString() == id.ToString());
答案 1 :(得分:0)
显然,课程ID
的属性System.Guid
类型为id
。
您没有指定Guid
的类型。由于您的错误报告,它不是Guid
。因为它经常工作,我认为它可以很容易地解析为Guid
,就像一个字符串。可能有时候字符串id不代表正确的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());
?
其他人给出的解决方案不起作用:
Guid idGuid = Guid.Parse(id);
Debug.Assert(myGuid.Equals(idGuid);
Guid foundGuid = dataContext.MyTable.FirstOrDefault(x => x.ID.Equals(idGuid));
原因:myGuid.ToString()导致一个不同的字符串,虽然id是myGuid的一个很好的字符串表示,但它不等于myGuid.ToString()
以下代码肯定会找到元素:
Guid.TryParse
如果您不确定该ID是否是正确的Guid,请使用Guid.Parse
,而不是EXEC (
'EXEC (''BEGIN Get_Data(?,?,?,?);
END;'', '+
@Id+','+
@Status+ ' OUTPUT,'+
@Customer+ ' OUTPUT,'+
@Name+ ' OUTPUT ) at ' +@LinkedServer
)
如果它甚至无法解析为适当的guid,请不要费心去做启动你的linq语句,因为你确定它不在MyTable中