2013-03-11 63 views
0

我一直在试图创建一个LINQ语句,它将连接左外连接的两个表。LINQ左连接抛出System.NullReferenceException或System.InvalidCastException

下面的代码获取的谁已登录用户工作的人一个DataTable(包含活动目录用户名),得到另一个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>(); 

回答

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(); 
+0

Thankyou,很好地解决了InvalidCastException。并且由于该异常已修复,我尝试解决NullReferenceException异常(以检查t2是否为空)现在也能正常工作。我将编辑您的答案,以包含该修复。 – paulH 2013-03-11 17:32:51

1

正如我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();