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

时间:2015-02-04 19:27:47

标签: sql sql-server entity-framework

编辑: 调用

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

如果我在sql管理工作室中运行下面的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'
  

转换为值类型'System.Guid'失败,因为已实现   value为null。结果类型的泛型参数或查询   必须使用可空类型

2 个答案:

答案 0 :(得分:5)

导致错误是因为从Sql查询返回的Guid列之一为NULL,并且无法绑定到InfoViewModel实体,因为匹配属性定义为Guid,而不是Nullable<Guid> Guid?Left Outer Join

这里可能的罪魁祸首是,如果SELECT c.UserId, ... SomeOther columns FROM dbo.Clients LEFT OUTER JOIN dbo.aspnet_Users AS c ON dbo.Clients.CollectionsAssignedTo = c.UserId ... 无法匹配,右侧表中的所有列都将返回NULL。您还没有提供SELECT列,因此我们只能推测,但例如:

dbo.Clients

此处,如果CollectionsAssignedTo中有一行,dbo.aspnet_Users的值没有相应c.UserId的{​​{1}}行,则会有一行返回,但c.UserId列将为NULL,您将收到问题中提到的错误。 (仅仅在INNER JOIN上存在LOJ可能意味着预期连接失败)。

答案 1 :(得分:1)

您的查询会在其中一个null列中返回Guid值。无法将null值放入DTO课程Guid中的InfoViewModel媒体资源中。您如何将null转换为Guid?不可能的。

使该属性接受null值。