2013-02-14 70 views
1

我有一個關於LINQ中的連接的問題。我目前正在將訪問應用程序轉換爲.NET,其中數據從兩個不同服務器上的兩個不同數據庫中檢索。在舊的應用程序中的數據可以通過一個查詢檢索:linq(右)加入不會返回正確的對象數

SELECT *,tbl2.Descr,tbl2.Form FROM tbl2的RIGHT JOIN TBL 1 ON tbl2.proId2 = tbl1.proId

我發現有一個辦法在.NET中這樣做是分別檢索兩個表,然後將它們與LINQ連接起來。我沒有LINQ的經驗,所以我可能完全錯誤的邏輯或代碼,因爲我似乎無法得到它的工作。

首先,我試圖做一個正常的連接(沒有權利),但只有18行返回時,兩個表包含近2000行。我也檢查了數據,它應該明確地導致更多的行,沒有那麼多的空單元格。所以然後我把右/左連接放在一起,但這實際上會導致錯誤。當我調試它時,LINQ語句執行時一切正常,但當我進入foreach時,顯示一個錯誤,並且錯誤實際上在linq語句中指示,表示table2爲空。當我檢查table1時,我也只能看到22個數據行。

我在做什麼錯?

DataTable dtTarget= data1.Clone(); 
var dt2Columns = data2.Columns.OfType<DataColumn>().Select(dc => 
    new DataColumn(dc.ColumnName, dc.DataType, dc.Expression, dc.ColumnMapping)); 
var dt2FinalColumns = from dc in dt2Columns.AsEnumerable() 
        where dtTarget.Columns.Contains(dc.ColumnName) == false 
           select dc; 

dtTarget.Columns.AddRange(dt2FinalColumns.ToArray()); 

var results = from table1 in data1.AsEnumerable() 
       join table2 in data2.AsEnumerable() 
       on table1.Field<String>("proId") equals table2.Field<String>("proId2") 
       select table1.ItemArray.Concat(table2.ItemArray).ToArray(); 

foreach (object[] values in results) 
      dtTarget.Rows.Add(values); 

外部聯接:

var results = from table1 in data1.AsEnumerable() 
       join table2 in data2.AsEnumerable() on table1.Field<String>("proId")  equals table2.Field<String>("proId2") into t_join 
       from table2 in t_join.DefaultIfEmpty(null) select table1.ItemArray.Concat(table2.ItemArray).ToArray(); 

回答

0

我注意到你正在使用的字符串作爲連接鍵。也許字符串比較在環境(access和.net)之間是不同的。 Access可能使用不區分大小寫的比較,而.net的默認值區分大小寫。

爲了讓.NET使用不區分大小寫的比較,這裏的第一個查詢:

var results = data1.AsEnumerable() 
    .Join(
    data2.AsEnumerable(), 
    row1 => row1.Field<String>("proId"), 
    row2 => row2.Field<String>("proId2"), 
    (row1, row2) => row1.ItemArray.Concat(row2.ItemArray).ToArray(), 
    StringComparer.InvariantCultureIgnoreCase); //and now caps are ignored. 

和第二查詢:

var results = data1.AsEnumerable() 
    .GroupJoin(
    data2.AsEnumerable(), 
    row1 => row1.Field<String>("proId"), 
    row2 => row2.Field<String>("proId2"), 
    (row1, row2s) => new {Row1 = row1, Row2s = row2s}, 
    StringComparer.InvariantCultureIgnoreCase) 
    .SelectMany(
    x => x.row2s.DefaultIfEmpty(null)), 
    (x, row2) => row2 == null ? x.Row1.ItemArray : x.Row1.ItemArray.Concat(row2.ItemArray).ToArray() 
); 
+0

OK,但沒關係第一個查詢不會改變任何東西,因爲我真的需要第二個。現在它工作正常,第二個表的列被添加到第一個表中,但添加表的大部分值都是空的。我覺得找到一些鑰匙是很奇怪的,但其中大部分都不是。你是對的,一個表來自訪問,另一個來自sql服務器。 – LittleWhiteFairy 2013-02-14 14:39:52

+0

我發現有什麼問題。鑰匙需要修剪。所以現在一切正常。謝謝大衛的幫助 – LittleWhiteFairy 2013-02-15 07:12:05