我尝试使用 PrimaryKey 方法通过主键连接表(ID 列是两个表中的主键)。但最后我得到了一张空桌子。告诉我如何使请求正确?
clientDT:
身份证 | 名字 | 城市 |
---|---|---|
1 | 约翰 | 纽约 |
2 | 雅各布 | 洛杉矶 |
3 | 威廉 | 芝加哥 |
4 | 伊森 | 旧金山 |
订购DT:
身份证 | 订单号 |
---|---|
1 | 123547 |
2 | 568688 |
3 | 89779 |
结果,我希望看到这样的表格:
名字 | 订单号 | 城市 |
---|---|---|
约翰 | 123547 | 纽约 |
雅各布 | 568688 | 洛杉矶 |
威廉 | 89779 | 芝加哥 |
我的代码:
var result = from client in clientDT.AsEnumerable()
join orders in orderDT.AsEnumerable()
on clientDT.PrimaryKey equals orderDT.PrimaryKey
select new
{
Name = client.Field <string> ("name"),
City = client.Field <string> ("city"),
Order_number = orders.Field <string> ("order_number")
};
DataTable dt = new DataTable();
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("city", typeof(string));
dt.Columns.Add("order_number", typeof(string));
foreach(var row in result)
{
dt.Rows.Add(new object[] { row.Name, row.City, row.Order_number});
}
result_DT = dt;
其实很简单。问题是您尝试比较所有主键。
table.PrimaryKey
属性将返回组成键的所有列的集合。因此,您要做的是比较包含一列的列表是否等于另一个包含一列的列表,这是错误的,因为它们包含不同的列。您需要沿着创建的行调整自己的方向。所以这是我目前能给你的最好的。它不是很漂亮,但它完成了工作
var result = from client in clientDT.AsEnumerable()
join orders in orderDT.AsEnumerable()
on client[clientDT.PrimaryKey[0]] equals orders[orderDT.PrimaryKey[0]]
select new
{
Name = client.Field<string>("name"),
City = client.Field<string>("city"),
Order_number = orders.Field<string>("order_number")
};
DataTable dt = new DataTable();
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("city", typeof(string));
dt.Columns.Add("order_number", typeof(string));
foreach (var row in result)
{
dt.Rows.Add(new object[] { row.Name, row.City, row.Order_number });
}
秘密就在这行
on client[clientDT.PrimaryKey[0]] equals orders[orderDT.PrimaryKey[0]]
尝试解释一下:您的客户和您的订单是行。从这些行中,我们可以获得一列的值,在我们的例子中,我们需要包含 PK 的列的值,在我们的例子中,它只是一列,这使得事情变得很好。
因此,我们的主键列是
orderDT.PrimaryKey[0]
,并在请求期间在各个行中获取它的值,我们执行 orders[orderDT.PrimaryKey[0]]
就完成了。