使用主键 LINQ 连接表

问题描述 投票:0回答:1

我尝试使用 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;
c# linq datatable
1个回答
0
投票

其实很简单。问题是您尝试比较所有主键。

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]]
就完成了。

© www.soinside.com 2019 - 2024. All rights reserved.