我有一個關於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();
OK,但沒關係第一個查詢不會改變任何東西,因爲我真的需要第二個。現在它工作正常,第二個表的列被添加到第一個表中,但添加表的大部分值都是空的。我覺得找到一些鑰匙是很奇怪的,但其中大部分都不是。你是對的,一個表來自訪問,另一個來自sql服務器。 – LittleWhiteFairy 2013-02-14 14:39:52
我發現有什麼問題。鑰匙需要修剪。所以現在一切正常。謝謝大衛的幫助 – LittleWhiteFairy 2013-02-15 07:12:05