编辑: 调用
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。结果类型的泛型参数或查询 必须使用可空类型
答案 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
值。