gpt4 book ai didi

c# - 如何执行行为与物理数据库内部联接完全一样的 LINQ 联接?

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:39 28 4
gpt4 key购买 nike

数据源是 CSV 文件的集合,因此没有实际的数据库。这是与日本已有数十年历史的遗留系统的集成。

我有一个 c# 函数需要将 2 个 DataTables 和 2 个列名作为参数。我的函数需要对这两个数据表执行相当于 INNER JOIN 的操作,然后返回第一个表中的所有列,并且仅返回第二个表中的“连接列”。

这些数据表的模式(读作:列)直到运行时才为人所知,因此该函数不能有任何硬编码的列名。我的函数最后需要返回一个包含内部连接数据的新 DataTable,以及一个基于刚刚指定的选择列表的 DISTINCTed 结果集。

这是我的[修改]尝试,它似乎产生了一个有希望的结果集:

public static DataTable JoinDataTables2(DataTable dt1, DataTable dt2, string table1KeyField, string table2KeyField) {
DataTable result = ( from dataRows1 in dt1.AsEnumerable()
join dataRows2 in dt2.AsEnumerable()
on dataRows1.Field<string>(table1KeyField) equals dataRows2.Field<string>(table2KeyField)
select dataRows1).CopyToDataTable();
return result;
}

我这样调用它:

Common.JoinDataTables2(dtCSV, _dtModelOptions, "CMODEL", "ModelID");

我的目标是像在物理数据库中一样执行内部联接,并根据上面指定的结果集生成不同的结果集。 您可能想知道为什么我不只是在数据库中进行连接。这是因为没有数据库;数据来自第三方系统生成的 CSV 文件。

所以我还有 3 个问题:

  1. 根据 INNER JOIN 行为,我不确定返回的结果集是否正确。
  2. 选择列表不包括第二个数据表的“连接列”(在这个特定示例中,这将是“ModelID”),而我需要它。一旦这样做,我就可以确认 CMODEL 值与 ModelID 值匹配,从而确认我有一个有效的连接。 (这只是一种情况,它会有所不同,因此不能在函数中硬编码任何列名。)
  3. 如何区分结果集?

这是我系统中的一个具体示例,但同样,数据表和模式都将不同:

dtCSV 列:

  1. C模型
  2. CATT_CD
  3. NSTAND
  4. CAPPLY1
  5. CAPPLY2
  6. DREFIX_D

_dtModelOptions 列:

  1. 系列号
  2. 模型ID
  3. 选项ID

我需要对我的功能进行哪些更改,以便:

  1. 它执行 INNER JOIN 和 DISTINCT(它已经这样做了吗?)
  2. 它从第一个表中选择所有列,仅从第二个表中选择“连接列”(目前它只获取第一个表的列)
  3. 性能尽可能快(我之前通过记录foreach来实现连接,但这种方法非常慢。)

最佳答案

较早的 Sotion ...

public static DataTable JoinDataTables2(DataTable dt1, DataTable dt2, string table1KeyField, string table2KeyField) {
DataTable result = ( from dataRows1 in dt1.AsEnumerable()
join dataRows2 in dt2.AsEnumerable()
on dataRows1.Field<string>(table1KeyField) equals dataRows2.Field<string>(table2KeyField)
select new {Col1= datarows1Field<string>(table1FieldName), Col2= datarows2.Field<string>(table2FieldName)}).Distinct().CopyToDataTable();
return result;
}

您可以在 select 查询中列出 table1 中的所有列。以下查询具有每个定义的数据表,其中包含表 1 中的所有列和表 2 中的键列。它可能对您有所帮助。

public static DataTable JoinDataTables2(DataTable dt1, DataTable dt2, string table1KeyField, string table2KeyField)
{
DataTable joinTable = new DataTable();
foreach (DataColumn dt1Column in dt1.Columns)
{
joinTable.Columns.Add(dt1Column.ColumnName, dt1Column.DataType);
}

var col2 = dt2.Columns[table2KeyField];
joinTable.Columns.Add(col2.ColumnName,typeof(string));

var result = (from dataRows1 in dt1.AsEnumerable()
join dataRows2 in dt2.AsEnumerable()
on dataRows1.Field<string>(table1KeyField) equals dataRows2.Field<string>(table2KeyField)
select new
{
Col1 = dataRows1,
Col2 = dataRows2.Field<string>(table2KeyField)
});
foreach (var row in result)
{
DataRow dr = joinTable.NewRow();
foreach (DataColumn dt1Column in dt1.Columns)
{
dr[dt1Column.ColumnName] = row.Col1[dt1Column.ColumnName];
}

dr[table2KeyField] = row.Col2;
joinTable.Rows.Add(dr);
}
joinTable.AcceptChanges();
return joinTable.AsEnumerable().Distinct().CopyToDataTable();
}

关于c# - 如何执行行为与物理数据库内部联接完全一样的 LINQ 联接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54083915/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com