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

Nic*_*ahn 5 sql sql-server entity-framework

编辑:打电话

  var _data = context.Database.SqlQuery<InfoViewModel>(sql).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

如果我在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'
Run Code Online (Sandbox Code Playgroud)

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

Stu*_*tLC 5

导致该错误的原因是,Guid从Sql查询返回的列之一为NULL,并且InfoViewModel由于匹配属性定义为Guid,not Nullable<Guid>或,因此无法绑定到您的实体Guid?

这里可能的罪魁祸首是,如果a 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
 ...
Run Code Online (Sandbox Code Playgroud)

在这里,如果存在一个Row dbo.Clients,其值CollectionsAssignedTo没有对应的dbo.aspnet_Usersrow相同c.UserId,则将返回一行,但是该c.UserId列将为NULL,并且您将收到问题中提到的错误。(LOJ超过INNER JOIN的存在可能意味着预期失败的联接)。