两个list比较

-一个大坑 2019-04-13 10:52:40
同步数据要怎么办,先把原来的都删了,再全部同步?这样每次同步几万笔数据,久了自增序列数值太大
有两个list (myfaPCMList,myfaMafaList)我想把相同的数据留着,不一样的删了,然后再同步
下面是我现在写的代码,只同步5个栏位还好,多了要写的也太多了,有什么好的方法吗
myfaPCMList和myfaMafaList有些栏位不一样,也不能直接用相交或差集

var assetList = myfaPCMList.Select(a => a.Asset).ToList();
var companyList = myfaPCMList.Select(b => b.Company).ToList();
var cnameList = myfaPCMList.Select(b => b.Cname).ToList();
var isValidList = myfaPCMList.Select(b => b.IsValid).ToList();
var ownerList = myfaPCMList.Select(b => b.Owner).ToList();
var equalList = myfaMafaList.Where(o => assetList.Contains(o.Asset) && companyList.Contains(o.Company) &&
cnameList.Contains(o.Cname) && isValidList.Contains(o.IsValid) && ownerList.Contains(o.Owner)).ToList();
var addList = myfaMafaList.Except(equalList).ToList();

var assetList2 = equalList.Select(a => a.Asset).ToList();
var companyList2 = equalList.Select(b => b.Company).ToList();
var cnameList2 = equalList.Select(b => b.Cname).ToList();
var isValidList2 = equalList.Select(b => b.IsValid).ToList();
var ownerList2 = equalList.Select(b => b.Owner).ToList();
var noEqualList = myfaPCMList.Where(o => !(assetList2.Contains(o.Asset) && companyList2.Contains(o.Company) &&
cnameList2.Contains(o.Cname) && isValidList2.Contains(o.IsValid) && ownerList2.Contains(o.Owner))).ToList();

_context.DeleteRange(noEqualList);
_context.AddRange(addList);
_context.SaveChanges();
...全文
245 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
from a in aList
from b in bList
where a.xx==b.xx && a.yy==b.yy //其它条件
类似这样写不就行了?为什么要每样都遍历出来后用contains?
-一个大坑 2019-04-13
  • 打赏
  • 举报
回复
引用 1 楼 stherix 的回复:
你这其实是2个表之间同步吧,不是List,List的方式来比较,那需要吧所有的数据全读到内存,显然不合适
不知道你的同步是要删掉目标表的现有数据,还是增量修改
如果没有保留原有数据的需求,那么删掉再直接把表复制过去比较好
增量导入的话,效率就比较低了

两个数据库之间的同步,为了方便比较,我把查的数据转成list了
没有要保存原数据的要求,但是删了再增加新的,我怕久了自增序列的栏位超出长度
因为是job效率低点影响不大
stherix 2019-04-13
  • 打赏
  • 举报
回复
你这其实是2个表之间同步吧,不是List,List的方式来比较,那需要吧所有的数据全读到内存,显然不合适 不知道你的同步是要删掉目标表的现有数据,还是增量修改 如果没有保留原有数据的需求,那么删掉再直接把表复制过去比较好 增量导入的话,效率就比较低了
  • 打赏
  • 举报
回复
比如说,人家同步日志,或者至少说有等价于日志的东西存在,永远不会修改或者消失。这就是先搞懂业务设计,然后才说什么低级的技术问题。
  • 打赏
  • 举报
回复
业务理解和建模设计上就烂,那么从业务上提不出任何启发,于是技术上毫无“比较”的技巧可言,编程肯定好不了。
stherix 2019-04-13
  • 打赏
  • 举报
回复
引用 2 楼 -一个大坑 的回复:
[quote=引用 1 楼 stherix 的回复:] 你这其实是2个表之间同步吧,不是List,List的方式来比较,那需要吧所有的数据全读到内存,显然不合适 不知道你的同步是要删掉目标表的现有数据,还是增量修改 如果没有保留原有数据的需求,那么删掉再直接把表复制过去比较好 增量导入的话,效率就比较低了
两个数据库之间的同步,为了方便比较,我把查的数据转成list了 没有要保存原数据的要求,但是删了再增加新的,我怕久了自增序列的栏位超出长度 因为是job效率低点影响不大[/quote] 怕自增序号大,你也可以删掉表结构重建啊
-一个大坑 2019-04-13
  • 打赏
  • 举报
回复
引用 3 楼 娃都会打酱油了 的回复:
from a in aList
from b in bList
where a.xx==b.xx && a.yy==b.yy //其它条件

类似这样写不就行了?为什么要每样都遍历出来后用contains?

这是相等,不等怎么写?
var aa = (from a in myfaMafaList
join b in myfaPCMList
on new { a.Asset, a.Cname, a.Company, a.IsValid, a.Owner }
equals new { b.Asset, b.Cname, b.Company, b.IsValid, b.Owner }
select new MyfaData
{
Asset = a.Asset,
Cname = a.Cname,
Company = a.Company,
IsValid = a.IsValid,
Owner = a.Owner,
Udate = DateTime.Now,
Uuser = "BG01"
});

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧