虽然我知道我可以通过sql连接2行,但我的程序不使用它 我有2个数据表,我拿每一行,比较另一个表上的行,并希望从中进行连接
public DataTable joinTables (DataTable t1, DataTable t2)
{
DataTable joinTable = new DataTable();
foreach (DataRow r1 in t1.Rows)
{
foreach (DataRow r2 in t2.Rows)
{
///if (....)
joinTable.ImportRow(joinRows(r1,r2));
}
}
return joinTable;
}
public DataRow joinRows (DataRow r1, DataRow r2)
{
DataRow joinRow = new DataRow();
///....
return joinRow;
}
答案 0 :(得分:1)
以下是使用LINQ进行连接的两种方法的示例。
var t1 = new DataTable();
var t2 = new DataTable();
t1.Columns.Add("id", typeof (Int32));
t1.Columns.Add("data", typeof (String));
t2.Columns.Add("id", typeof (Int32));
t2.Columns.Add("data", typeof (Int32));
t1.Rows.Add(new {id=1, data="John"});
t1.Rows.Add(new {id = 2, data = "Mary"});
t2.Rows.Add(new {id = 1, data = "100"});
t2.Rows.Add(new {id = 2, data = "200"});
var results = from x in t1.Select()
join y in t2.Select() on (Int32) x["id"] equals (Int32) y["id"]
select (new {id = x["id"], name = x["data"], number = y["data"]});
var lamdaResults = t1.Select().Join(
t2.Select(), x => x["id"], y => y["id"],
(x, y) => new {id=x["id"], name=x["data"], number=y["data"]});
答案 1 :(得分:1)
我认为你可能已经大大低估了你所寻找的复杂性,但是这里有一些代码可以做到,但它有一些我将讨论的主要假设。
public DataTable joinTables (DataTable t1, DataTable t2)
{
DataTable t = new DataTable();
AddColumns(t1, t);
AddColumns(t2, t);
for (int i = 0; i < t1.Rows; i++)
{
DataRow newRow = t.NewRow();
for (int j = 0; j < t1.Columns.Count; j++)
{
SetMergedRowValue(t1.Rows[i], newRow, j);
SetMergedRowValue(t2.Rows[i], newRow, j);
}
t.Rows.Add(newRow);
}
t.AcceptChanges();
}
private void AddColumns(DataTable source, DataTable target)
{
foreach (DataColumn c in source.Columns)
{
target.Columns.Add(string.Format("{0}_{1}", source.TableName, c.ColumnName), c.DataType);
}
}
private void SetMergedRowValue(DataRow source, DataRow target, int index)
{
var columnName = string.Format("{0}_{1}", source.Table.TableName, source.Table.Columns[index]);
target[columnName] = source[index];
}
DataTable
都有相同的行数。DataTable
对象中的行按照您希望它们按索引合并的顺序排序。这些假设很重要。简而言之,虽然这会产生预期的结果,但我不确定它是真的你正在寻找什么,而我不确定你非常确定你是什么正在寻找。
答案 2 :(得分:0)
好吧,所有疯子们,我想我已经破解了。
这是我想出的解决方案,在做事时有点痛苦,但它却将两个数据行作为一个,这正是我想要的。
默认情况下找不到任何可以做到这一点的东西,但是请告诉我它是否存在。
private DataRow JoinDataRow(DataRow r1, DataRow r2)
{
// Get table columns
var r1Cols = r1.Table.Columns;
var r2Cols = r2.Table.Columns;
// Create datatable to base row from
var tempDataTable = new DataTable();
foreach (DataColumn col in r1Cols)
{
tempDataTable.Columns.Add(new DataColumn(col.ColumnName, col.DataType, col.Expression, col.ColumnMapping));
}
foreach (DataColumn col in r2Cols)
{
tempDataTable.Columns.Add(new DataColumn(col.ColumnName, col.DataType, col.Expression, col.ColumnMapping));
}
// Create new return row to be returned
DataRow returnRow = tempDataTable.NewRow();
// Fill data
int count = 0;
for (int r1Index = 0; r1Index < r1Cols.Count; r1Index ++)
{
returnRow[r1Index] = r1[r1Index];
count++;
}
for (int r2Index = count; r2Index < r2Cols.Count + count; r2Index++)
{
returnRow[r2Index] = r2[r2Index -count];
}
// Return row
return returnRow;
}
如何使用它的一个实例可能是使用LINQ将两个单独的数据表连接在一起,并且您希望这些行相应地起作用,请参见下面的示例:
var memberCompanyDetails =
(from DataRow member in members.Rows
join DataRow company in companies.Rows on member["company"] equals company["company"]
select JoinDataRow(member, company)).AsEnumerable().CopyToDataTable();