DataTable数据对比

DataTable数据对比

文章目录

  • DataTable数据对比
  • 前言
  • 一、计算DataTable差集
    • 结构不同的情况
    • 结构相同的情况
  • 二、计算DataTable交集
    • 结构不同的情况
    • 结构相同的情况
  • 三、计算DataTable的并集合
    • 两个DaTable结构相同的情况计算并集


前言

开发中我们经常会出现查询数据库后返回DataTable的情况,那么DataTable中常用的一些操作阁下又了解多少呢,例如:两个结构不同DataTable怎么找出他们俩之间的交集和差集。


一、计算DataTable差集

结构不同的情况

示例:这里的情况是我们要过滤掉老数据取到新数据,其中:
dt:是查询到的所有数据。
dt的数据:

afsServiceOrder OrderId
0 order0
1 order1
2 order2
3 order3
4 order4

oldData:里是已经处理过的数据,也就是需要从”dt“中剔除的数据。
oldData的数据:

afsServiceOrder
2

示例代码如下:

DataTable dt = new DataTable();
            dt.Columns.Add("afsServiceOrder");
            dt.Columns.Add("OrderId");
            for (int i = 0; i < 5; i++)
            {
                DataRow dr = dt.NewRow();

                dr["afsServiceOrder"] = i;
                dr["OrderId"] = "orderid" + i;

                dt.Rows.Add(dr);
            }

            DataTable oldData = new DataTable();
            oldData.Columns.Add("afsServiceOrder");
            DataRow dr1 = oldData.NewRow();
            dr1["afsServiceOrder"] = 2;
            oldData.Rows.Add(dr1);

            var WaiteData = from r in dt.AsEnumerable() where !(from rr in oldData.AsEnumerable() select rr.Field<string>("afsServiceOrder")).Contains(r.Field<string>("afsServiceOrder")) select r;
           
            dt = WaiteData.CopyToDataTable();
            foreach (DataRow item in dt.Rows)
            {
                Console.WriteLine(item["afsServiceOrder"]);
                Console.WriteLine(item["OrderId"]);
            }

输出结果如下:
DataTable数据对比_第1张图片

结构相同的情况

dt:是查询到的所有数据。
dt的数据:

afsServiceOrder OrderId
0 order0
1 order1
2 order2
3 order3
4 order4

oldData:里是已经处理过的数据,也就是需要从”dt“中剔除的数据。
oldData的数据:

afsServiceOrder OrderId
2 order2
var WaiteData = dt.AsEnumerable().Except(oldData.AsEnumerable(), DataRowComparer.Default);  

输出的结果和上面是一样的

二、计算DataTable交集

结构不同的情况

示例:这里的情况是库存同步,需要找出新的库存数据和老的库存数据共有的商品库存信息然后进行Update操作。

var waitUpdata=from r in oldData.AsEnumerable()  
                    where  
                        (from rr in newData.AsEnumerable() select rr.Field<string>("GoodsId ")).Contains(  
                        r.Field<string>("GoodsId "))  
                    select r; 

newData:新的库存数据
这里newData的数据如下:

GoodsId GoodsQty
6788123 50

oldData:数据库老的库存数据
这里是oldData的数据如下:

GoodsId GoodsQty GoodsName
6788123 50 测试商品1
892211 90 测试商品2
ZH302021 10 测试商品3
2256411 60 测试商品4

这里过滤后得到的数据如下:

GoodsId GoodsQty GoodsName
6788123 50 测试商品1

结构相同的情况

newData:新的库存数据
这里newData的数据如下:

GoodsId GoodsQty
6788123 50

oldData:数据库老的库存数据
这里oldData的数据如下:

GoodsId GoodsQty
6788123 50
892211 90
ZH302021 10
2256411 60
var intersectUser = oldData.AsEnumerable().Intersect(newData, DataRowComparer.Default);

得到的结果:

GoodsId GoodsQty GoodsName
6788123 50 测试商品1

三、计算DataTable的并集合

这中情况用到的并不多就不过多介绍了,

两个DaTable结构相同的情况计算并集

IEnumerable AllData = Data1.AsEnumerable().Union(Data2.AsEnumerable(), DataRowComparer.Default);
//转换为DataTable
DataTable Datas= AllData.CopyToDataTable();

你可能感兴趣的:(C#,数据库,c#)