c# - 如何比较两个数据表并更新数据表中给出结果数据表的不匹配行?

标签 c# asp.net

主数据

ID     姓名
1     中环
2    东
3    东中环
4    东海岸
5    北
6    西北

7    南

8    中南部

9    西

收到数据

ID     名称     值
1     中环 125.65
5     北     553.21

我希望结果如下

ID     名称            值
1     中环             125.65
2     东                0.0
3     东中环             0.0
4     东海岸         0.0
5     北         553.21
6     西北        0.0
7     南         0.0
8     中南部        0.0
9     西         0.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 to object 获得您想要的内容:

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>你可以得到DataTable对象返回,使用 ToDataTable<T>扩展方法:

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;
    }
}

您可以获得DataTable来自query并附有以下声明:

var result = query.ToDataTable();

关于c# - 如何比较两个数据表并更新数据表中给出结果数据表的不匹配行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15741843/

相关文章:

c# - 在 Asp.Net Core + EF Core 中缓存数据的模式?

c# - IdentityServer 3 不会启动

c# - SqlDataAdapter、SqlBulkCopy 和 DataTable 与 NetTopologySuite.IO.SqlServerBytes

asp.net - 允许 允许 AD 组访问

c# - ASP.NET GridView 无法隐藏列

c# - 如何从 .net 中的 MySql 过程中选择输出参数

c# - 与 Outlook 互操作的 OpenSharedItem 在 Office 2003 中抛出奇怪的异常,与 Office 2008 一起工作

asp.net - 如何将数据集与gridview绑定(bind)

c# - 我怎样才能自动让页面以 5 分钟的间隔将当前时间保存到数据库而不需要回发?