C#LINQ用外部联接联接3个表

时间:2018-10-12 10:31:52

标签: c# linq

我正在努力通过外部联接来联接3个表。 下面是我的代码:

disabledColor

与此同时,我得到“对象引用未设置为对象的实例”。 我认为是因为我要加入字段“ res.Results_Id”,而该字段可能为null? 有办法解决吗?

2 个答案:

答案 0 :(得分:0)

要调试此命令,我建议将其分为几个子查询。 但是在您的情况下,问题是DefaultIfEmpty函数,它可能会返回 具有一个用于引用类型的“默认”元素的集合,默认值为null 因此,您需要先检查dnbres.Any()是否始终为空,然后再对某物使用.。 您可以使用?. for null check并在最后提供默认值。  像这样:

if (obj?.IsValid ?? false) { // not valid or obj is null }

因此您的代码将类似于:

  if ((fp?.DataNodeBase?.IsAny() ?? false) &&
      (fp?.Results?.IsAny() ?? false))
  {
       var nodedbs =
           (from dnb in fp.DataNodeBase
                 join res in fp.Results on dnb.DataNodeBase_Id equals 
                 res.DataNodeBase_Id into dnbres
                 from res in dnbres
                 join queryres in fp.DataNodeQueryResult on res.Results_Id equals 
                      queryres.Results_Id into nodeandquery
                 from queryres in nodeandquery
                 where( dnb.Nodes_Id == operatorstation.OperatorStation_Id) && 
                        ((dnb.IsNull("Family") ? "" : dnb.Family).Contains("FileCompare") == false)
                 select new
                 {
                     NodeID = dnb.Nodes_Id,
                     ResultsDataNodeBaseID = (res == null ? -1 : res.DataNodeBase_Id),
                     NodeDataBaseNodeID = dnb.DataNodeBase_Id,
                     DataNodeQueryResults = (queryres == null ? -1 : queryres.Results_Id)
                 }).ToArray();
        }

答案 1 :(得分:0)

嗨,我在项目中遇到过几次这个问题,像这样更新您的代码以克服错误。您的部分代码如下

 select new
      {
        NodeID = ((dnb != null)? dnb.Nodes_Id : 0),
        ResultsDataNodeBaseID = ((res != null) ? res.DataNodeBase_Id : -1),
        NodeDataBaseNodeID = ((dnb != null)? dnb.DataNodeBase_Id : 0),
        DataNodeQueryResults = ((queryres != null) ? queryres.Results_Id : -1)
      }).ToArray();

注意:在访问对象的数据成员之前,请检查对象是否为空