如何比较两个数据表并更新数据表中不匹配的行,该数据表给出结果数据表

本文关键字:数据表 结果 不匹配 比较 何比较 两个 更新 | 更新日期: 2023-09-27 18:06:43

MasterData

Id nbsp;名称
1 nbsp;中心
2 nbsp;东部
3 nbsp;中东部
4 nbsp;东海岸
5 nbsp;北方
6 nbsp;西北

7 nbsp;南

8 nbsp;中南部

9 nbsp;西部

接收的数据

Id nbsp;名称 nbsp;价值
1 nbsp;CENTRAL nbsp;125.65
5 nbsp;NORTH nbsp;553.21

我希望结果如下

Id nbsp;名称 nbsp nbsp nbsp nbsp;价值
1 nbsp;CENTRAL nbsp nbsp nbsp nbsp;125.65
2 nbsp;EAST nbsp nbsp nbsp nbsp nbsp 0
3 nbsp;中东 nbsp nbsp nbsp nbsp;0
4 nbsp;东海岸 nbsp nbsp 0
5 nbsp;NORTH nbsp nbsp 553.21
6 nbsp;西北 nbsp nbsp 0
7 nbsp;南方 nbsp nbsp 0
8 nbsp;中南部 nbsp nbsp 0
9 nbsp;WEST nbsp nbsp 0

请注意,所有这些都是数据表,我如何才能获得结果

如何比较两个数据表并更新数据表中不匹配的行,该数据表给出结果数据表

假设您的DataTable声明如下:

var dt1 = new DataTable();
dt1.Columns.Add(new DataColumn("Id", typeof(int)));
dt1.Columns.Add(new DataColumn("Name", typeof(string)));
var dt2 = new DataTable();
dt2.Columns.Add(new DataColumn("Id", typeof(int)));
dt2.Columns.Add(new DataColumn("Name", typeof(string)));
dt2.Columns.Add(new DataColumn("Value", typeof(double)));

您可以加入它,并使用LINQ对象获得您想要的东西:

var query = from r1 in dt1.AsEnumerable()
            join r2 in dt2.AsEnumerable() on r1.Field<int>("Id") equals r2.Field<int>("Id") into r3
            from r4 in r3.DefaultIfEmpty()
            select new
            {
                Id = r1.Field<int>("Id"),
                Name = r1.Field<string>("Name"),
                Value = r4 == null ? 0.00 : r4.Field<double>("Value")
            };

使用IEnumerable<Anonymous_Type>,您可以使用ToDataTable<T>扩展方法取回DataTable对象

public static class EnumerableToDataTableConverter
{
    public static DataTable ToDataTable<T>(this IEnumerable<T> items)
    {
        DataTable dataTable = new DataTable(typeof(T).Name);
        //Get all the properties
        PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (PropertyInfo prop in Props)
        {
            //Setting column names as Property names
            dataTable.Columns.Add(prop.Name);
        }
        foreach (T item in items)
        {
            var newRow = dataTable.NewRow();
            for (int i = 0; i < Props.Length; i++)
            {
                //inserting property values to datatable rows
                newRow[Props[i].Name] = Props[i].GetValue(item, null);
            }
            dataTable.Rows.Add(newRow);
        }
        //put a breakpoint here and check datatable
        return dataTable;
    }
}

您可以通过以下语句从query获得DataTable

var result = query.ToDataTable();