DataTable数据对比

DataTable数据对比


前言

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


一、计算DataTable差集

结构不同的情况

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

afsServiceOrderOrderId
0order0
1order1
2order2
3order3
4order4

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的数据:

afsServiceOrderOrderId
0order0
1order1
2order2
3order3
4order4

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

afsServiceOrderOrderId
2order2
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的数据如下:

GoodsIdGoodsQty
678812350

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

GoodsIdGoodsQtyGoodsName
678812350测试商品1
89221190测试商品2
ZH30202110测试商品3
225641160测试商品4

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

GoodsIdGoodsQtyGoodsName
678812350测试商品1

结构相同的情况

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

GoodsIdGoodsQty
678812350

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

GoodsIdGoodsQty
678812350
89221190
ZH30202110
225641160
var intersectUser = oldData.AsEnumerable().Intersect(newData, DataRowComparer.Default);

得到的结果:

GoodsIdGoodsQtyGoodsName
678812350测试商品1

三、计算DataTable的并集合

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

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

IEnumerable AllData = Data1.AsEnumerable().Union(Data2.AsEnumerable(), DataRowComparer.Default);
//转换为DataTable
DataTable Datas= AllData.CopyToDataTable();
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

或与且与或非

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值