[英]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.