Левое объединение с запросом linq не работает с пустыми столбцами в datatable - PullRequest
1 голос
/ 28 марта 2019

У меня есть две таблицы данных, для которых я выполняю левое соединение с использованием 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, поскольку таблицы данных поступают из двух разных источников.

1 Ответ

1 голос
/ 28 марта 2019

Вы должны добавить нулевые проверки к полям, которые могут быть нулевыми (user_id, firstname, usertype, subid) следующим образом:

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(),

          };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...