C# 在LINQ中与OrderBy左连接

C# 在LINQ中与OrderBy左连接,c#,.net,linq,left-join,C#,.net,Linq,Left Join,我有两张单子。 第一个是从API(APITasks)中提取的任务列表,第二个是我在本地SQL数据库中拥有的任务列表。该工具允许用户“声明”APITask,并通过存储TaskIssueId在本地记录该声明 有时,APITask任务可能会被删除。我的工具的代码会注意到这一点,并在用户列出所有“声称”的任务时向用户提及。 现在,我遇到的问题是让用户的任务通过APITasks进行排序(按另一个Id InternalID排序,它是另一个Id,复杂且不相关),如果任何任务不再可用,仍然会显示它(我的代码捕获

我有两张单子。 第一个是从API(APITasks)中提取的任务列表,第二个是我在本地SQL数据库中拥有的任务列表。该工具允许用户“声明”APITask,并通过存储TaskIssueId在本地记录该声明

有时,APITask任务可能会被删除。我的工具的代码会注意到这一点,并在用户列出所有“声称”的任务时向用户提及。 现在,我遇到的问题是让用户的任务通过APITasks进行排序(按另一个Id InternalID排序,它是另一个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
将变为空,并且所有内容都从那里爆炸。

您需要检查d是否为空,而不是另一个internalid

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();
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();

这不再崩溃,但是因为它忽略了d为null的条目,所以我没有得到左连接。例如,如果我在
myTasksFiltered
中有10个条目,在
APITasks
中有9个条目,我仍然会得到10个条目,其中一个条目是
AnotherInternalID=0
,但其中d!=null我只得到9。其中d!=null忽略了左边的连接,这正是我要找的!谢谢当DefaultifEmpty表包含相同的内容时,如何使其区别开来value@gayan1991请提出一个新的问题,你有具体的问题,我和其他几个人会很乐意尝试回答它。