2012-08-01 17 views
1

例如存在的,我有這個樣子與數據表C#的LINQ - 從一個表中選擇什麼不會在其他

DATATABLE 1

COLA | COLB | COLC 
1  123  321 
2  321  333 
3  222  232 

DATATABLE 2

COLA | COLB | COLC 
1  123  321 
2  321  333 
兩個表

我想從表一中只選擇第3行。

我希望能夠加入兩個表一起上COLA ID,但隨後只能選擇從DATATABLE 1是做諾託行存在DATATABLE 2

我怎樣才能在LINQ做到這一點?

我強烈希望結果是一個數據表,或Ienumerable或容易改變回數據表。如果這是不可能的,我會管理。

回答

7
var rows = from t1 in table1.AsEnumerable() 
      join t2 in table2.AsEnumerable() 
       on t1.Field<int>("COLA") equals t2.Field<int>("COLA") into tg 
      from tcheck in tg.DefaultIfEmpty() 
      where tcheck == null 
      select t1 

這最終執行左外連接,並從table2任何爲NULL的行意味着table1記錄不具有匹配。我建議不要使用Any方法,因爲它可能會在table1的每一行中列舉table2(對於較大的集合,這很糟糕)。 LINQ Join將僅枚舉一次這兩個表,以便爲您指定的選擇器函數查找匹配對。

+0

我剛剛嘗試了這一點,並得到「指定的演員是無效的。」作爲我的結果。不知道有什麼問題。有任何想法嗎? – Kyle 2012-08-01 19:20:27

+0

你的一列沒有被指定爲int。看看'table1.Columns [「COLA」] .DataType'和'table2.Columns [「COLA」] .DataType'返回的內容。我確定其中一個被設置爲除了整數字段之外的其他字段(在這種情況下,您應該將''更改爲必要的數據類型並且可能會強制轉換)。 – SPFiredrake 2012-08-01 19:26:59

+0

我確定他們都是ints,但其中一個是Int64,另一個是Int32。我改變了我可以控制的一個爲Int64,並將兩個更改爲,現在我得到錯誤'不能投出DBNull.Value鍵入'System.Int64'。請使用可空類型.' 我試過讓列爲Int64?但數據表不支持它 – Kyle 2012-08-01 20:16:32

3

最簡單的方法是:

var dt2Cola = new HashSet<int>(table2.AsEnumerable() 
            .Select(x => x.Field<int>("COLA")); 

var dt1Rows = table1.AsEnumerable() 
        .Where(x => !dt2Cola.Contains(x.Field<int>("COLA")); 
+0

我收到 「指定的轉換無效」。例外,當我嘗試這 – Kyle 2012-08-01 19:04:54

相關問題