拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 用C#和LinQ匹配两个资料集

用C#和LinQ匹配两个资料集

白鹭 - 2022-01-23 1962 0 0

我必须从纯文本档案中汇入信息,使用三个栏位将其与数据库记录匹配。

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 个步骤,因为问题在问题中是如何呈现的

  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

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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *