我必须从纯文本档案中汇入信息,使用三个栏位将其与数据库记录匹配。
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 吗?有关如何解决此问题的任何指示都会有所帮助。
uj5u.com热心网友回复:
最简单的方法是使用资料表中内置的功能来解决这个问题。这是完成作业的一行代码,但这里有 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
uj5u.com热心网友回复:
要直接回答有关使用 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")
};
0 评论