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