在LINQ中使用Left Join和OrderBy

4
我有两个列表,第一个是从API获取的任务列表(APITasks),第二个是我在本地SQL数据库上拥有的任务列表。该工具允许用户“认领”APITask,并通过存储TaskIssueId在本地记录该认领。
有时候会发生APITask被删除的情况。我的工具有代码可以注意到这一点,并在用户列出所有“认领”的任务时向用户提醒。现在我遇到的问题是通过APITasks对用户的任务进行排序(按AnotherInternalId排序,这是另一个复杂且无关的ID),如果任何任务不再可用,则仍然将其显示(我的代码捕获异常并显示消息)。
以下是我的SQL查询:
myTasks = (from m in myTasksFiltered
           join d in APITasks on m.TaskIssueId equals d.TaskIssueId
               into joinedData
           from d in joinedData.DefaultIfEmpty()
           let index = (int?)d.AnotherInternalId  ?? 0
           orderby index
           select m).ToList();

这个帖子有助于创建该查询,但当查询到达未在APITask中出现的本地任务时,我不断收到空引用异常错误,因为d变成了null,并从那里开始发生一切混乱。
2个回答

8
您需要检查d不为null,而不是AnotherInternalId。
myTasks = (from m in myTasksFiltered
           join d in APITasks on m.TaskIssueId equals d.TaskIssueId
               into joinedData
           from d in joinedData.DefaultIfEmpty()
           let index = d == null ? 0 : d.AnotherInternalId
           orderby index
           select m).ToList();

当DefaultifEmpty表包含相同值时,如何使其不同? - gayan1991
@gayan1991 请提出一个新问题,并明确你遇到的具体问题,我和其他几个人很乐意试图回答它。 - cadrell0

1
myTasks = (from m in myTasksFiltered
       join d in APITasks on m.TaskIssueId equals d.TaskIssueId
           into joinedData
       from d in joinedData.DefaultIfEmpty()
       where d != null
       let index = (int?)d.AnotherInternalId  ?? 0
       orderby index
       select m).ToList();

不再崩溃了,但是因为它忽略了d为空的条目,所以我无法得到左连接。例如,如果在myTasksFiltered中有10个条目,在APITasks中有9个条目,我仍然应该得到10个条目,其中一个是AnotherInternalID = 0,但是使用where d != null,我只能得到9个条目。 - LanFeusT
当 d != null 时,忽略左连接。 - cadrell0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接