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"]);}
输出结果如下:
结构相同的情况
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();