这个问题可能有 10 个重复,但我想知道是否有比我目前这样做更好的方法。这是我用来展示我如何确定差异的一个小例子:
//let t1 be a representation of the ID's in the database.
List<int> t1 = new List<int>() { 5, 6, 7, 8 };
//let t2 be the list of ID's that are in memory.
//these changes need to be reflected to the database.
List<int> t2 = new List<int>() { 6, 8, 9, 10 };
var hash = new HashSet<int>(t1);
var hash2 = new HashSet<int>(t2);
//determines which ID's need to be removed from the database
hash.ExceptWith(t2);
//determines which ID's need to be added to the database.
hash2.ExceptWith(t1);
//remove contents of hash from database
//add contents of hash2 to database
我想知道我是否可以确定在 ONE 操作中添加和删除什么,而不是我目前必须做的两个。有什么方法可以提高此操作的性能吗?请记住,在实际的数据库情况中,有数十万个 ID。
编辑或第二个问题,是否有我可以直接在数据库上执行的 LINQ 查询,这样我就可以提供新的 ID 列表并让它自动删除/添加自己?(使用 mysql)
澄清我知道我需要两个 SQL 查询(或一个存储过程)。问题是我是否可以在一个操作中确定列表中的差异,以及是否可以比这更快地完成。
编辑2
SPFiredrake 的这个操作似乎比我的 hashset 版本更快——但是我不知道如何确定要从数据库中添加哪个以及从数据库中删除哪个。有没有办法在操作中包含该信息?
t1.Union(t2).Except(t1.Intersect(t2))
编辑3
没关系,我忘记了这个语句实际上存在延迟执行的问题,尽管如果有人想知道,我通过使用自定义比较器和一个添加的变量来确定它来自哪个列表,从而解决了我之前的问题。