【问题标题】:Joining linq to Dataset Query using multiple columns使用多列将 linq 加入数据集查询
【发布时间】:2013-06-15 22:18:33
【问题描述】:

您好,我正在尝试加入 2 个数据表,左侧的一个包含 3 个不同的列作为主键,另一个包含与外键相同的列,这是左侧的数据表图像:

正确的 DataTable Imge 就是这个:

这是我正在尝试使用的代码,但没有返回任何内容,它应该是

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")

        };

谁能告诉我为什么会这样或者我写的查询是错误的,请你们帮帮我。

【问题讨论】:

  • 结果如何?你有什么例外吗?
  • 不,我没有得到任何异常,但它返回空 dataTaable
  • 可能是因为DBNull! = 空
  • “右数据表”是否总是有空键值的记录?如果有至少一个匹配,也许你希望它们匹配? IE。 where A == A OR B == B OR C == C。如下所述,您显示的数据永远不会匹配。
  • 是的,我开始意识到,你所说的就是我所做的。感谢您的意见。

标签: c# linq .net-3.5


【解决方案1】:

根据您的示例数据,您在此处没有任何匹配项(零与空值不匹配)。如果由于您的应用程序的逻辑而这没问题,那么您可以将字段的值转换为int 而不是Nullable&lt;int&gt;。在这种情况下,将为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") 
    }   

【讨论】:

  • @Clement 为什么我不知道你遇到了什么样的错误?
  • @Clement 只是为第一个键选择器添加默认值
  • 我试过了也没用还是语法错误,请问有没有其他方法可以加入这个DataTable?
  • @Clement 更新了答案。我认为 &lt;int&gt; 而不是 &lt;int?&gt; 应该在你的情况下完成这项工作。
猜你喜欢
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 2016-03-01
  • 2013-01-18
  • 2014-03-14
相关资源
最近更新 更多