我正在尝试将 SQL 查询转换为 LINQ to entities 查询,但在使用 LINQ select block 时遇到了一些问题。
这是按预期执行的 SQL 查询:
SELECT distinct( p.PendingID,
p.Description,
p.Date,
f.Status,
u.UserName,
m.MapID
FROM Pending p
JOIN Users u
ON p.UserID = u.UserID
LEFT JOIN Forks f
ON p.PendingID = f.PendingID
LEFT JOIN Maps m
ON f.ForkID = m.ForkID
ORDER BY p.Date DESC
这是我到目前为止的 LINQ to entities 查询:
var pList = (from pending in pendingItems
// JOIN
from user in userList.Where(u => pending.UserID == u.UserID)
// LEFT OUTER JOIN
from fork in forkList.Where(f => pending.ID == f.PendingID)
.DefaultIfEmpty()
// LEFT OUTER JOIN
from map in mapList.Where(m => fork.ID == m.ForkID)
.DefaultIfEmpty()
orderby pending.Date descending
select new
{
ItemID = pending.ID, // Guid
Description = pending.Description, // String
Date = pending.Date, // DateTime
Status = fork.Status, // Int32 (*ERROR HERE*)
UserName = user.UserName, // String
MapID = map.ID // Guid (*ERROR HERE*)
})
.Distinct()
.ToList();
LINQ 查询在以下两行中的任何一行上失败,它们试图分配从左外连接 结果中检索到的值。如果省略以下行,LINQ 查询将无错误地完成:
Status = fork.Status,
MapID = map.ID
为什么这 2 个属性分配在 LINQ 查询的选择 block 中失败?
最佳答案
问题是由于您的外部连接,fork
和 map
可能为空。当然,当它们为空时,您将无法访问它们的属性。您可能需要这样的东西:
Status = (fork == null) ? null : fork.Status,
MapID = (map == null) ? null : map.ID
关于c# - LINQ to Entities - 多个连接 - 'Select' 上的空引用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4502568/