0

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

下面的代码获取DataTable为登录用户工作的人员(包含 Active Directory 用户名),获取另一个DataTable是 AD 用户名和应用程序登录名之间的交叉引用,然后加入他们以创建一个List<string>包含应用程序登录名的名称(如果存在)其他为登录用户工作的每个人的 AD 用户名。

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

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

System.InvalidCastException:无法将“<>f__AnonymousType1`1[System.String]”类型的对象转换为“System.String”类型

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>();
4

2 回答 2

3

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

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();
于 2013-03-11T17:20:12.870 回答
2

由于我对 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();
于 2013-03-11T17:50:26.017 回答