4

我有两个 ICollection 集合:

public partial class ObjectiveDetail
{
    public int ObjectiveDetailId { get; set; }
    public int Number { get; set; }
    public string Text { get; set; }
}

var _objDetail1: // contains a list of ObjectiveDetails from my database.
var _objDetail2: // contains a list of ObjectiveDetails from web front end. 

如何遍历这些并发布和添加、删除或更新以将数据库与来自 Web 前端的最新版本同步?

如果第一个列表中存在记录但第二个列表中没有记录,那么我想:

_uow.ObjectiveDetails.Delete(_objectiveDetail);

如果第二个列表中存在记录但第一个列表中没有记录,那么我想:

_uow.ObjectiveDetails.Add(_objectiveDetail);

如果第一个和第二个有记录(相同的ObjectiveDetailId),那么我需要查看它们是否相同,如果没有发出:

_uow.ObjectiveDetails.Update(_objectiveDetail);

我想用某种方式做到这一点:

foreach (var _objectiveDetail in _objectiveDetails) {} 

但后来我想我可能需要其中两个,我也想知道是否有更好的方法。有人对我如何做到这一点有任何建议吗?

4

3 回答 3

4

以下代码是一些可能的解决方案之一

var toBeUpdated =
            objectiveDetail1.Where(
            a => objectiveDetail2.Any(
                b => (b.ObjectiveDetailId == a.ObjectiveDetailId) && 
                     (b.Number != a.Number || !b.Text.Equals(a.Text))));

var toBeAdded =
            objectiveDetail1.Where(a => objectiveDetail2.All(
            b => b.ObjectiveDetailId != a.ObjectiveDetailId));

var toBeDeleted =
            objectiveDetail2.Where(a => objectiveDetail1.All(
            b => b.ObjectiveDetailId != a.ObjectiveDetailId));

剩下的就是将三个集合添加、删除、更新到数据库的简单代码。

于 2013-08-10T19:31:11.150 回答
1

看起来你只是希望这两个列表是彼此的副本,你可以只实现一个 Copy 方法并替换过时的集合,如果你实现 ICollection 你将需要实现 CopyTo,你也可以添加一个版本字段到容器,以便您知道是否需要更新它。如果您不想这样做,并且想要遍历元素并更新它们,请检查您是否可以在每个对象中保存状态(修改、删除、更新),这将有助于比较。

于 2013-08-10T09:37:30.903 回答
-1

foreach (var _objectiveDetail in _objectiveDetails) {} 但我想我可能需要其中两个,我也想知道是否有更好的方法。有人对我如何做到这一点有任何建议吗?

而不是遍历整个集合使用 LINQ 查询:

var query = from _objectiveDetail in _objectiveDetails

where (condition) select ... ;

更新: 如果你想从 web 端更新/删除/添加一些东西,遍历整个集合是没有意义的。人类比计算机慢一点,不是吗?一件一件地做。事实上,我不明白 2 个集合的想法。它是干什么用的?如果您仍然想要它:使用事件运行查询,选择更新/删除/添加记录,对其进行适当的操作。

于 2013-08-10T08:42:43.953 回答