![](/img/trans.png)
[英]C# Linq - Matching two sets of data and updating the first set on a match
[英]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 個步驟,因為問題在問題中是如何呈現的:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.