2013-03-11 65 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();