使用 LINQ 的 INNER JOIN 3 数据表

Posted

技术标签:

【中文标题】使用 LINQ 的 INNER JOIN 3 数据表【英文标题】:INNER JOIN 3 Data Tables using LINQ 【发布时间】:2017-12-17 03:38:59 【问题描述】:

尝试使用 LINQ 连接三个数据表 table1、table2、table3。表 1 和表 2 在 2 个条件下连接,表 1 和表 3 在 1 个条件下连接。以下是我的代码。但我得到一个例外说 “无法将 'System.DBNull' 类型的对象转换为 'System.String' 类型。”

下面是我的代码:

var result = from cust in tblCust.AsEnumerable()
             join mat in tblMat.AsEnumerable()
             new  coil_id = (string)cust["coil_id"], order_id = (string)cust["order_id"] 
             equals
             new  coil_id = (string)mat["PIECE_ID"], order_id = (string)mat["PRODUCTION_ORDER_ID"] 
                                 join parts in tblParts.AsEnumerable() on (string)mat["PIECE_ID"] equals (string)parts["ProdCoilNo"]
             select new
             
                 coil_id = mat["PIECE_ID"],
                 order_id = mat["PRODUCTION_ORDER_ID"],
                 part = parts["PartNumber"],
                 gauge = mat["THICKNESS"],
                 width = mat["WIDTH"],
                 weight = mat["WEIGHT"],
                 code = mat["MATERIAL_BLOCK_STATE"],
                 requestor_comment = cust["requestor_comment"],
                 requestor = cust["requestor"],
                 updated_by_comment = cust["updated_by_comment"],
                 updated_by_user = cust["updated_by_user"]                                     
             ;

我在 (string)parts["ProdCoilNo"] 附近遇到异常

【问题讨论】:

【参考方案1】:

对包含null的字段使用coalesce操作符替换为空字符串

像这样:

coil_id = mat["PIECE_ID"] ?? String.Empty,

【讨论】:

【参考方案2】:

使用coalesce 运算符

var result = from cust in tblCust.AsEnumerable()
         join mat in tblMat.AsEnumerable()
         new  coil_id = (string)cust["coil_id"], order_id = (string)cust["order_id"] 
         equals
         new  coil_id = (string)mat["PIECE_ID"], order_id = (string)mat["PRODUCTION_ORDER_ID"] 
                             join parts in tblParts.AsEnumerable() on (string)mat["PIECE_ID"] equals (string)parts["ProdCoilNo"]
         select new
         
             coil_id = mat["PIECE_ID"]?? String.Empty,
             order_id = mat["PRODUCTION_ORDER_ID"]?? String.Empty,
             part = parts["PartNumber"]?? String.Empty,
             gauge = mat["THICKNESS"]?? String.Empty,
             width = mat["WIDTH"]?? String.Empty,
             weight = mat["WEIGHT"]?? String.Empty,
             code = mat["MATERIAL_BLOCK_STATE"]?? String.Empty,
             requestor_comment = cust["requestor_comment"]?? String.Empty,
             requestor = cust["requestor"]?? String.Empty,
             updated_by_comment = cust["updated_by_comment"]?? String.Empty,
             updated_by_user = cust["updated_by_user"]?? String.Empty                                     
         ;

【讨论】:

没有帮助,.. 同样的异常

以上是关于使用 LINQ 的 INNER JOIN 3 数据表的主要内容,如果未能解决你的问题,请参考以下文章

Linq GroupJoin (join...into) 导致 INNER JOIN?

将 LINQ 用于 Inner Join() 方法

带有 WHERE 子句的 SQL INNER JOIN 到 LINQ 格式

如何将 SQL Inner Join、Group By 转换为 Linq?

你如何在 Linq 中写一个带有“OR”的 INNER JOIN

EF Core Inner join 改为 Left