繁体   English   中英

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

[英]C# LINQ join 3 tables with outer join

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

                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.DefaultIfEmpty()
                              join queryres in fp.DataNodeQueryResult on res.Results_Id equals queryres.Results_Id into nodeandquery
                              from queryres in nodeandquery.DefaultIfEmpty()
                              where (dnb.Nodes_Id == operatorstation.OperatorStation_Id)
                              && ((dnb.IsNull("Family") ? "" : dnb.Family).Contains("File Compare") == 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();

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

为了调试此问题,我建议将其分为几个子查询。 但是在您的情况下,问题是DefaultIfEmpty函数,它可能返回一个带有一个“默认”元素作为引用类型的集合,默认值是null因此您需要在使用dnbres.Any()和ALWAYS之前检查是否为null . 在某事上。 您可以使用?. 进行null检查并最后提供默认值。 像这样 :

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM