簡體   English   中英

用 C# 和 LinQ 匹配兩個數據集

[英]Matching two data sets with C# and LinQ

我必須從純文本文件中導入信息,使用三個字段將其與數據庫記錄匹配。

DB fields
RowId, DF1, DF2, DF3, 

Text file fields
TF1,TF2,TF3,TF4

Matching
DF1 = TF1
DF2 = TF2
DF3 = TF3

Result
RowID, TF4 (Optional, F1,F2,F3)

由於我對 C# 和 LinQ 的經驗有限,這很麻煩。

我嘗試將 DB 表和文本文件分別加載到 DataTable 中,並將它們轉換為 asEnumerable() 以與 LinQ 一起使用,但找不到正確構造 LinQ 的代碼參考。

var result = (from db in dtDB.AsEnumerable()
join txt in dtTxt.AsEnumerable() on <<MATCH INSTRUCTION>>
where << WHERE INSTRUCTION >>
select new {
           db.RowID,
//         F1,
//         F2,
//         F3,
           txt.TF4
}).asArray
 

問題是如何引用“Enumerable”中的每個字段並構造 Match 和 Where 指令。 我應該使用其他結構而不是 DataTables 嗎? 有關如何解決此問題的任何指示都會有所幫助。

要直接回答有關使用 linq 將 DataTables 與復合鍵連接的問題,您需要使用別名:

var result = from db in dtDB.AsEnumerable()
             join txt in dtTxt.AsEnumerable()
             on new { id = db.Field<string>("ID"), f1 = db.Field<string>("DF1"), f2 = db.Field<string>("DF2") }
                equals new { id = txt.Field<string>("ID"), f1 = txt.Field<string>("TF1"), f2 = txt.Field<string>("TF2") }
             where db.Field<string>("ID") == "xxx"
             select new
             {
                 id = db.Field<string>("ID"),
                 //         F1,
                 //         F2,
                 //         F3,
                 tf4 = txt.Field<string>("TF4")
             };

最簡單的方法是使用數據表中內置的功能來解決這個問題。 這是完成工作的一行代碼,但這里有 3 個步驟,因為問題在問題中是如何呈現的

  1. 從數據庫中設置表的主鍵列
  2. 將文本文件中表中的匹配列命名為相同
  3. 調用dataTableFromDb.Merge(dataTableFromTextFile);

步驟1:


//for example, imagine your DB has given you this:
var dtDb = new DataTable();
dtDb.Columns.Add("RowId");
dtDb.Columns.Add("DF1");
dtDb.Columns.Add("DF2");
dtDb.Columns.Add("DF3");
dtDb.Rows.Add("Rowid1", "A", "B", "C");
dtDb.Rows.Add("Rowid2", "D", "E", "F");

//and your text file has given you this:
var dtF = new DataTable();
dtF.Columns.Add("TF1");
dtF.Columns.Add("TF2");
dtF.Columns.Add("TF3");
dtF.Columns.Add("TF4");
dtF.Rows.Add("A", "B", "C", "4");

第 2 步:確保每個表中鏈接列的列名相同(在此過程的早期重命名它們以使您的生活更輕松,例如在從文本文件中讀取時命名它們,或者在填充 dtdb 時使用 SQL 中的 AS來自分貝)

dtF.Columns["TF1"].ColumnName = "DF1";
dtF.Columns["TF2"].ColumnName = "DF2";
dtF.Columns["TF3"].ColumnName = "DF3";

確保目標表有主鍵

dtDb.PrimaryKey = new[] { dtDb.Columns["DF1"], dtDb.Columns["DF2"], dtDb.Columns["DF3"] };

將文件表合並到數據庫表中

dtDb.Merge(dtF);

實際上,生成數據庫表的過程應該給它它的主鍵(所以步驟 1 應該是不必要的),並且從文件生成表的過程應該等同於列名(所以步驟 2 應該是不必要的)如此字面意思您需要使用的唯一代碼行來自第 3 步:

dtDb.Merge(dtF);

dtDb 表是生成的合並表; 您可以將其顯示在屏幕上並將其保存回 DB etcc

https://dotnetfiddle.net/Ia71IM

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM