2011-12-01 63 views
3

我有两个列表。 第一个是从API(APITasks)拉取的任务列表,第二个是我在本地SQL DB上的任务列表。该工具允许用户“声称”APITask,并通过存储TaskIssueId在本地记录该声明。在LINQ中与OrderBy左连接

它可能会不时发生一个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(); 

thread帮助创建一个查询,但我不断收到一个空引用异常错误,因为当查询到达本地的任务是不存在的APITask,d成为空一切都从那里吹起来。

回答

4

你需要检查d不为空,不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(); 
+0

这就是我一直在寻找的!谢谢! – LanFeusT

+0

当DefaultifEmpty表中包含相同的值时,您如何使它不同? – gayan1991

+0

@ 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(); 
+0

这已经不崩溃,而是因为它忽略了条目,其中d为null我不明白的左连接。例如,如果我在'myTasksFiltered'中有10个条目,在'APITasks'中有9个条目,我仍然应该返回10个,其​​中一个是'AnotherInternalID = 0',但是'where d!= null'我只返回9个。 – LanFeusT

+0

其中d!= null忽略了左连接 – cadrell0