C# 使用多列将linq连接到数据集查询
您好,我正在尝试连接2个数据表。左一个包含3个不同的列作为主键,另一个包含相同的列作为外键。这里是左数据表图像: 右边的数据表Imge是: 这是我正在尝试使用的代码,但是没有返回任何内容,并且应该返回C# 使用多列将linq连接到数据集查询,c#,linq,.net-3.5,C#,Linq,.net 3.5,您好,我正在尝试连接2个数据表。左一个包含3个不同的列作为主键,另一个包含相同的列作为外键。这里是左数据表图像: 右边的数据表Imge是: 这是我正在尝试使用的代码,但是没有返回任何内容,并且应该返回 var query5 = from ChanToNGrsToNgrDAnWal in chanToNGrsToNgrDAnWal.AsEnumerable() join Node in node.AsEnumerable() on ne
var query5 =
from ChanToNGrsToNgrDAnWal in chanToNGrsToNgrDAnWal.AsEnumerable()
join Node in node.AsEnumerable()
on new {
A = ChanToNGrsToNgrDAnWal.Field<int?>("diffusers_Id"),
B = ChanToNGrsToNgrDAnWal.Field<int?>("analogs_Id"),
C = ChanToNGrsToNgrDAnWal.Field<int?>("wallstats_Id") }
equals new {
A = Node.Field<int?>("diffusers_Id"),
B = Node.Field<int?>("analogs_Id"),
C = Node.Field<int?>("wallstats_Id")
}
select new
{
channel_Id = ChanToNGrsToNgrDAnWal.Field<int?>("channel_Id"),
number = ChanToNGrsToNgrDAnWal.Field<string>("number"),
nodeGroups_Id = ChanToNGrsToNgrDAnWal.Field<int>("nodeGroups_Id"),
analogNodeSerial = ChanToNGrsToNgrDAnWal.Field<string>("analogNodeSerial"),
diffuserNodeSerial = ChanToNGrsToNgrDAnWal.Field<string>("diffuserNodeSerial"),
wallStatNodeSerial = ChanToNGrsToNgrDAnWal.Field<string>("wallStatNodeSerial"),
diffusers_Id = ChanToNGrsToNgrDAnWal.Field<int?>("diffusers_Id"),
analogs_Id = ChanToNGrsToNgrDAnWal.Field<int?>("analogs_Id"),
wallstats_Id = ChanToNGrsToNgrDAnWal.Field<int?>("wallstats_Id"),
typeCode = Node.Field<string>("typeCode"),
node_Id = Node.Field<int?>("node_Id")
};
var查询5=
来自ChanToNGrsToNgrDAnWal中的ChanToNGrsToNgrDAnWal.AsEnumerable()
在Node.AsEnumerable()中加入节点
关于新{
A=ChanToNGrsToNgrDAnWal.字段(“扩散器Id”),
B=ChanToNGrsToNgrDAnWal.字段(“类似物Id”),
C=ChanToNGrsToNgrDAnWal.Field(“wallstats_Id”)}
等于新{
A=节点字段(“扩散器Id”),
B=节点字段(“模拟Id”),
C=节点字段(“wallstats_Id”)
}
选择新的
{
通道Id=ChanToNGrsToNgrDAnWal.Field(“通道Id”),
编号=ChanToNGrsToNgrDAnWal.字段(“编号”),
节点组Id=ChanToNGrsToNgrDAnWal.Field(“节点组Id”),
analogNodeSerial=ChanToNGrsToNgrDAnWal.Field(“analogNodeSerial”),
diffuserNodeSerial=ChanToNGrsToNgrDAnWal.Field(“diffuserNodeSerial”),
wallStatNodeSerial=ChanToNGrsToNgrDAnWal.Field(“wallStatNodeSerial”),
扩散器Id=ChanToNGrsToNgrDAnWal.Field(“扩散器Id”),
analogs_Id=ChanToNGrsToNgrDAnWal.Field(“analogs_Id”),
wallstats\u Id=ChanToNGrsToNgrDAnWal.Field(“wallstats\u Id”),
typeCode=节点字段(“typeCode”),
node\u Id=node.Field(“node\u Id”)
};
有谁能告诉我为什么会发生这种情况,或者我写的查询是错误的,你们能帮我一下吗。根据您的示例数据,这里没有任何匹配项(零与空不匹配)。如果应用程序的逻辑允许,则可以将字段的值转换为
int
,而不是Nullable
。在这种情况下,将为DbNull
单元格提供默认值(零):
on new {
A = ChanToNGrsToNgrDAnWal.Field<int>("diffusers_Id"),
B = ChanToNGrsToNgrDAnWal.Field<int>("analogs_Id"),
C = ChanToNGrsToNgrDAnWal.Field<int>("wallstats_Id")
}
equals new {
A = Node.Field<int>("diffusers_Id"),
B = Node.Field<int>("analogs_Id"),
C = Node.Field<int>("wallstats_Id")
}
在新的{
A=ChanToNGrsToNgrDAnWal.字段(“扩散器Id”),
B=ChanToNGrsToNgrDAnWal.字段(“类似物Id”),
C=ChanToNGrsToNgrDAnWal.字段(“wallstats_Id”)
}
等于新{
A=节点字段(“扩散器Id”),
B=节点字段(“模拟Id”),
C=节点字段(“wallstats_Id”)
}
结果是什么?这里有异常吗?没有,我没有异常,但它返回空数据Table可能是因为DBNull!=Null“Right DataTable”是否总是包含键值为空的记录?如果至少有一个匹配项,你可能希望他们匹配?即
,其中A==A或B==B或C==C
。正如下面所指出的,你所展示的数据永远不会匹配。是的,我逐渐意识到,你所说的肯定就是我所做的。谢谢您的输入。@Clement为什么我不知道您遇到了什么样的错误?@Clement只需为第一个键选择添加默认值,或者尝试了一下也没有效果仍然语法错误,我想知道是否没有其他方法可以用来加入此数据表?@Clement更新了答案。我认为在你的情况下,应该由
而不是
来做这项工作。