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

'System.Guid' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type

编辑: 打电话

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

如果我 运行 下面 sql 在 sql management studio 和它的工作没有抛出任何错误但是如果我使用 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'

The cast to value type 'System.Guid' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type

您的查询 returns Guid 列之一中的 null 值。 null 值不能放入 DTO class InfoViewModel 中的 Guid 属性。您如何将 null 转换为 Guid?不可能。

使 属性 接受 null 值。

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

这里可能的罪魁祸首是,如果 Left Outer Join 无法匹配,则右侧 table 中的所有列都将返回 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 的行没有对应的 dbo.aspnet_Users 行具有相同的 c.UserId,则一行将被返回,但是 c.UserId 列将为 NULL,您将收到问题中提到的错误。 (仅仅存在 LOJ 而不是 INNER JOIN 可能意味着失败的连接是预期的)。