LINQ左连接抛出系统.NullReferenceException或System.InvalidCastExcepti

本文关键字:NullReferenceException System InvalidCastExcepti 系统 连接 LINQ | 更新日期: 2023-09-27 18:03:17

我一直在尝试创建一个LINQ语句,将连接两个表与左外连接。

下面的代码获得为登录用户工作的人的DataTable(包含Active Directory用户名),获得另一个DataTable,这是AD用户名和应用程序登录名之间的交叉引用,然后将它们连接起来创建包含应用程序登录名(如果存在)或AD用户名的List<string>,用于为登录用户工作的每个人。

当登录列表中不包含从属列表中的任何人时,发生NullReferenceException错误(在select new行上)。

InvalidCastException错误发生(在return result...行),当登录列表确实包含下属列表中的人。这里的完整错误是:

系统。InvalidCastException:无法转换类型的对象& lt;> f__AnonymousType1 ' 1(系统。'到类型'系统。字符串'

TMReportsDataSet.EmployeeDataTable subordinates = SessionTyped.Subordinates;
TMReportsDataSet.EmployeeLoginDataTable logins = CacheTyped.Logins;
var result = from t1 in subordinates.AsEnumerable()
             join t2 in logins.AsEnumerable()
             on t1.ADAccountName equals t2.ADAccountName
             into joinedDT
             from t2 in joinedDT.DefaultIfEmpty()
             select new
             {
                 userName = (string)(t2.LoginName ?? t1.ADAccountName)
             };
return result.Cast<string>().ToList<string>();

LINQ左连接抛出系统.NullReferenceException或System.InvalidCastExcepti

您正在尝试将匿名类型强制转换为字符串。删除匿名类型的使用,如下所示:

var result = from t1 in subordinates.AsEnumerable()
                 join t2 in logins.AsEnumerable()
                 on t1.ADAccountName equals t2.ADAccountName
                 into joinedDT
                 from t2 in joinedDT.DefaultIfEmpty()
                 select (string)(t2.LoginName ?? t1.ADAccountName);
return result.ToList();

我对Magnus的回答的编辑被拒绝了[我不明白为什么?]这里是我的问题的完整答案,这基本上是Magnus给出的答案,但有一个额外的检查,看看是否t2 == null,以避免得到NullReferenceException错误。

var result = from t1 in subordinates.AsEnumerable()
                 join t2 in logins.AsEnumerable()
                 on t1.ADAccountName equals t2.ADAccountName
                 into joinedDT
                 from t2 in joinedDT.DefaultIfEmpty()
                 select (string)(t2 == null ? "" : (t2.LoginName ?? t1.ADAccountName));
return result.ToList();