有些时候,处理数据时,需要根据旧数据判断新数据有哪些需要进行处理。
这里有个根据Linq进行处理的简单示例。
此示例创建了一个Person对象,使用IDNo字段作为唯一校验的字段。
Person定义如下:
public class Person
{
public string IDNo { get; set; }
public string Name { get; set; }
}
对比方法如下:
/// <summary>
/// 获取比较后的Person数据
/// </summary>
private Tuple<List<Person>, List<Person>, List<Person>> GetDiffPersonList(List<Person> oldList, List<Person> newList)
{
//新增的
var addnewList = (from n in newList
join o in oldList on new { IDNo = n.IDNo } equals new { IDNo = o.IDNo } into otmp
from ot in otmp.DefaultIfEmpty()
where ot == null
select n).ToList();
//不变的/需要修改的
var modifyList = (from n in newList
join o in oldList on new { IDNo = n.IDNo } equals new { IDNo = o.IDNo } into otmp
from ot in otmp.DefaultIfEmpty()
where ot != null
select n).ToList();
//删除的
var deleteList = (from o in oldList
join n in newList on o.IDNo equals n.IDNo into ntmp
from nt in ntmp.DefaultIfEmpty()
where nt == null
select o).ToList();
return new Tuple<List<Person>, List<Person>, List<Person>>(addnewList, modifyList, deleteList);
}
调用的代码如下:
public void Test()
{
var oldperons = new List<Person>(); //替换为实际旧数据
var newperons = new List<Person>(); //替换为实际新数据
var editPersonLists = GetDiffPersonList(oldperons, newperons);
var addPersonList = editPersonLists.Item1;
var modPersonList = editPersonLists.Item2;
var delPersonList = editPersonLists.Item3;
if (addPersonList != null && addPersonList.Count() > 0) //要新增的
{
//新增处理
}
if (modPersonList != null && modPersonList.Count() > 0) //不变的/要修改的
{
//修改处理(或不改动)
}
if (delPersonList != null && delPersonList.Count() > 0) //要删除的
{
//删除处理
}
}
这样的简单的对比,就可以实现增删改的结果获取。
实际使用时,IDNo可以改为别的一个字段,或者多个字段。