"System.Guid"失败,因为实例化的值为空。结果类型的泛型参数或查询必须使用可空类型。

6

编辑: 调用

  var _data = context.Database.SqlQuery<InfoViewModel>(sql).FirstOrDefault();

如果我在SQL Management Studio中运行下面的SQL语句,而且它没有抛出任何错误,但是如果我使用EF调用相同的查询,它会抛出以下错误消息:
这里是我的SQL:
SELECT 
 FROM dbo.Clients LEFT OUTER JOIN  
 dbo.aspnet_Users AS c ON dbo.Clients.CollectionsAssignedTo = c.UserId 
 LEFT OUTER JOIN dbo.aspnet_Users AS b ON dbo.Clients.Auditors_Key = b.UserId 
 LEFT OUTER JOIN dbo.aspnet_Users AS a ON dbo.Clients.AcctRep = a.UserId 
 WHERE dbo.Clients.ClientPKID = 'ce723426-dert-4c36-980a-f5181870d0d4'

由于实例化的值为null,将其转换为值类型'System.Guid'时失败。结果类型的泛型参数或查询必须使用可为空类型。

你怎么从代码中调用它? - nZeus
3
这不是一个有效的GUID -- 在GUID中,'f'后面不能有字母,它必须是十六进制的。 - Hogan
http://guid.us/Test/GUID... 这个相关吗?https://dev59.com/bmw05IYBdhLWcg3whCNn - xQbert
即使使用了这个 GUID“ce723426-bfbe-4c48-980a-f5181870d0b4”,我仍然得到相同的错误。 - Nick Kahn
@StuartLC:请以回答的形式回复,我会接受为答案。 - Nick Kahn
2个回答

6
错误是由于你的Sql查询中返回的一个Guid列为NULL,无法绑定到你的InfoViewModel实体,因为匹配的属性被定义为Guid,而不是Nullable<Guid>Guid?
这里很可能的罪犯是如果一个Left Outer Join无法匹配,则右侧表中的所有列都将返回NULL。由于你没有提供SELECT列,所以我们只能推测,例如:
SELECT c.UserId, ... SomeOther columns
 FROM dbo.Clients 
 LEFT OUTER JOIN dbo.aspnet_Users AS c ON dbo.Clients.CollectionsAssignedTo = c.UserId
 ...

如果在dbo.Clients中存在一个行,其中具有CollectionsAssignedTo的值,该值没有与相同的c.UserIddbo.aspnet_Users行相对应,则将返回一行。然而,c.UserId列将为NULL,并且您将收到提问中提到的错误。(LOJ与INNER JOIN相比仅仅存在可能暗示了失败的连接是预期的)。


这段程序相关的内容需要翻译成中文。请仅返回翻译后的文本:我在 LINQ 查询的末尾添加了 .DefaultIfEmpty().FirstOrDefault(),因为如果没有匹配的记录,LINQ 查询将无法返回 null。谢谢。 - adnan

1
你的查询在一个 Guid 列中返回了一个 null 值。这个 null 值不能被放入到你的 DTO 类 InfoViewModel 中的 Guid 属性中。如何将 null 转换为 Guid?不可能。
让属性接受 null 值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接