[英]Compare Two Complex List of data
当我尝试将当前数据列表保存到数据库中时,我需要从数据库中获取现有数据,并需要与当前数据列表进行比较。
我有两个列表,一个是 PreviousList(来自 DB 的现有数据),另一个是 CurrentList(修改后的数据)
public class SoftClose
{
public int ID = -1;
public int AID = -1;
public int WFID = -1;
public string PREFIX;
public DateTime SCDATE;
public string STATUS;
}
在 CurrentList 中,我将 Prefix 修改为 D2,其中 ID=1 并添加了新行(Id=4)...
我的要求是
当我尝试将 CurrentList 保存到 Db 时,
如果 CurrentList 中有任何在 PreviousList 中没有的新前缀,我需要插入该新行并需要将该行的 Status 更改为 ADD。
我在 CurrentList 中将 Prefix 更改为 D2,其中 Id = 1。 D1 是有 DB 而不是在 CurrentList 中,所以我需要删除它。 所以我需要将该记录的状态更改为 DELETE。 我不应该在 id=1 的地方插入 D2 记录,因为 D2 已经存在。 如果我更改为 D5,其中 Id = 1,那么我需要插入它,因为 D5 不在 DB 中所以我需要将状态更改为 UPDATE。
这该怎么做? 比较列表的最佳方法是什么
这是您可以尝试的解决方案:
List<SoftClose> previousList = new List<SoftClose>(){
new SoftClose(){ID=1, Status = "NO_CHANGE",AID="19", Prefix = "D1"},
new SoftClose(){ID=2, Status = "NO_CHANGE",AID="20", Prefix = "D2"},
new SoftClose(){ID=3, Status = "NO_CHANGE",AID="21", Prefix = "D3"}
};
List<SoftClose> currentList = new List<SoftClose>(){
new SoftClose(){ID=1, Status = "NO_CHANGE",AID="19", Prefix = "D2"},
new SoftClose(){ID=2, Status = "NO_CHANGE",AID="20", Prefix = "D2"},
new SoftClose(){ID=3, Status = "NO_CHANGE",AID="21", Prefix = "D6"},
new SoftClose(){ID=4, Status = "NO_CHANGE",AID="22", Prefix = "D4"},
new SoftClose(){ID=5, Status = "NO_CHANGE",AID="22", Prefix = "D5"}
};
var addlist = currentList.Where(c => previousList.All(p => !p.ID.Equals(c.ID) && !p.Prefix.Equals(c.Prefix)));
foreach(var n in addlist)
{
var index = currentList.FindIndex(p => p.Prefix.Equals(n.Prefix));
currentList[index].Status = "ADD";
}
var updateORdeletelist = currentList.Where(c => c.Status.Equals("NO_CHANGE") && previousList.Exists(p => p.ID.Equals(c.ID) && !p.Prefix.Equals(c.Prefix)));
foreach (var n in updateORdeletelist)
{
var index = currentList.FindIndex(p => p.Prefix.Equals(n.Prefix));
if (previousList.FindIndex(p => p.Prefix.Equals(n.Prefix)) < 0)
currentList[index].Status = "UPDATE";
else
currentList[index].Status = "DELETE";
}
foreach (var item in currentList)
{
Console.WriteLine($"Id:{item.ID}, Desc1:{item.Prefix}, Status:{item.Status}");
}
输出
Id:1, Desc1:D2, Status:DELETE
Id:2, Desc1:D2, Status:NO_CHANGE
Id:3, Desc1:D6, Status:UPDATE
Id:4, Desc1:D4, Status:ADD
Id:5, Desc1:D5, Status:ADD
在https://www.codeproject.com/Articles/27122/Side-by-Side-SQL-Comparer-in-C 中有一个名为Side by Side SQL Comparer 的 C#工具。
组件的基本用途:
using (TextReader tr = new StreamReader(@"c:\1.sql"))
{
sideBySideRichTextBox1.LeftText = tr.ReadToEnd();
}
using (TextReader tr = new StreamReader(@"c:\2.sql"))
{
sideBySideRichTextBox1.RightText = tr.ReadToEnd();
}
sideBySideRichTextBox1.CompareText();
您将左侧和右侧加载到它们各自的变量sideBySideRichTextBox1.LeftText和sideBySideRichTextBox1.RightText并将它们与sideBySideRichTextBox1.CompareText()进行比较;
在您的情况下, 1.sql和2.sql将是您的 PreviousList 和 CurrentList 数据库文件。
项目现场有更详细的文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.