c# - LINQ to Entities - 多个连接 - 'Select' 上的空引用异常

标签 c# linq linq-to-entities

我正在尝试将 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 中失败?

最佳答案

问题是由于您的外部连接,forkmap 可能为空。当然,当它们为空时,您将无法访问它们的属性。您可能需要这样的东西:

Status = (fork == null) ? null : fork.Status,
MapID = (map == null) ? null : map.ID 

关于c# - LINQ to Entities - 多个连接 - 'Select' 上的空引用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4502568/

相关文章:

c# - Azure消息总线异步检索数据并通过 Controller 操作返回数据

c# - 更新 Active Directory 用户登录名域

c# - 唯一选择用户名

.net - 将两个 LINQ 查询合并为一个

c# - 在字符串中找到一个确切的词

c# - Rhino 模拟 - AssertWasCalled : How to improve unclear diagnostic message when incorrect arguments

c# - 是否可以使用 c# lang(dotnet 核心运行时)定义 shell 脚本?

.net - IEnumerable<T> : how is it performance? 上的扩展方法

c# - Entity Framework Core - 对计算字段进行排序

c# - 按降序排序不适用于 LINQ to Entity