Левое соединение с запросом linq не работает с нулевыми столбцами в datatable

#c# #sql #asp.net #linq

#c# #sql #asp.net #linq

Вопрос:

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

Вы должны добавить проверки на нуль к полям, которые могут быть нулевыми ( 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(),

          };
  

Комментарии:

1. Это не работает. По-прежнему выдает ошибку «{System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта}»

2. Я думаю, проблема здесь в этом,— b[«user_id»] , если есть какой-либо другой способ получить значение в этом столбце, он должен сработать.

3. Хорошо, тогда b равно нулю, поэтому проверьте и это: b?["user_id"]?.ToString()