【问题标题】:Left join with linq query does not work with null columns in datatable使用 linq 查询的左连接不适用于数据表中的空列
【发布时间】:2023-03-06 05:56:01
【问题描述】:

我有两个使用 linq 执行左连接的数据表。当我使用 JOIN 时它确实有效,但由于在使用左连接时它在结果数据中有一些空值,所以它不起作用。下面是代码

DataTable dt1 = user.getData();
DataTable dt2 = user.getOldData();
var results = from p2 in dt2.AsEnumerable()
              join p1 in dt1.AsEnumerable()
              on p2["XPNNUM"].ToString() equals (string)p1["pid"]
              into a
              from b in a.DefaultIfEmpty()

              select new
              {
                    XPNNUM = p2["XPNNUM"].ToString(),
                    XPNNAM = (string)p2["XPNNAM"],
                    XPNGRD = (string)p2["XPNGRD"],

                    user_id = b["user_id"].ToString(),
                    firstname = b["firstname"].ToString(),
                    usertype = b["usertype"].ToString(),
                    subid = b["subid"].ToString(),

              };

如果数据如下所示,这将不起作用,并且它会给出未设置为实例错误的对象引用。

+--------+--------+--------+---------+-----------+----------+-------+
| XPNNUM | XPNNAM | XPNGRD | user_id | firstname | usertype | subid |
+--------+--------+--------+---------+-----------+----------+-------+
|     12 | Test   |      4 | null    | null      | null     | null  |
+--------+--------+--------+---------+-----------+----------+-------+

有没有更好的方法来做同样的事情?由于数据表来自两个不同的来源,因此无法在 SQL 端执行此操作。

【问题讨论】:

    标签: c# sql asp.net linq


    【解决方案1】:

    您必须为字段添加空检查,这些字段可以为空(user_idfirstnameusertypesubid),如下所示:

    DataTable dt1 = user.getData();
    DataTable dt2 = user.getOldData();
    var results = from p2 in dt2.AsEnumerable()
              join p1 in dt1.AsEnumerable()
              on p2["XPNNUM"].ToString() equals (string)p1["pid"]
              into a
              from b in a.DefaultIfEmpty()
    
              select new
              {
                    XPNNUM = p2["XPNNUM"].ToString(),
                    XPNNAM = (string)p2["XPNNAM"],
                    XPNGRD = (string)p2["XPNGRD"],
    
                    user_id = b?["user_id"]?.ToString(),
                    firstname = b?["firstname"]?.ToString(),
                    usertype = b?["usertype"]?.ToString(),
                    subid = b?["subid"]?.ToString(),
    
              };
    

    【讨论】:

    • 它不工作。仍然给出错误“{System.NullReferenceException: Object reference not set to an instance of an object}”
    • 我猜这里的问题是这个,--- b["user_id"] ,如果有任何其他方法可以获取该列中的值,它应该可以工作。
    • 好的,那么 b 为空,所以也要检查一下:b?["user_id"]?.ToString()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    相关资源
    最近更新 更多