Silverlight Client←→Server数据同步备忘代码

#region 同步单位
void SyncUnit() {
    ProgressContent = "正在同步单位...";
    var query = Context.GetUnitsQuery().Where(p => p.ShopUniqueId == App.CurrentShop.UniqueId);
    Context.Load(query, LoadUnitCallback, null);
}

void LoadUnitCallback(LoadOperation<RP_Unit> loadOp) {

    //服务端数据
    IEnumerable<RP_Unit> serverUnits = Context.RP_Units;
    //客户端数据
    IEnumerable<RP_Unit> clientUnits;
    //获取数据
    using (var helper = new LocalDb.UnitHelper()) {
        clientUnits = helper.GetList();
    }
    //获取交集用来同步已存在且需要更新的实体
    var intersectUnits = serverUnits.Intersect(clientUnits, new UnitEntityCompare());

    //遍历交集集合
    foreach (var item in intersectUnits) {
        // 根据交集的项目分别获取服务端及客户端需要更新的数据
        var serverUnitToUpdate = serverUnits.First(p => p.UniqueId == item.UniqueId);
        var clientUnitToUpdate = clientUnits.First(p => p.UniqueId == item.UniqueId);
        // 根据更新时间进行比较,如果相同则忽略操作
        if (clientUnitToUpdate.UpdateDate != serverUnitToUpdate.UpdateDate) {

            //如果服务端较新,则更新客户端
            if (clientUnitToUpdate.UpdateDate < serverUnitToUpdate.UpdateDate) {
                using (var helper = new LocalDb.UnitHelper()) {
                    helper.UpdateUnit(serverUnitToUpdate);
                }
            }
            //否则更新服务端
            else {
                serverUnitToUpdate.UpdateDate = clientUnitToUpdate.UpdateDate;
                serverUnitToUpdate.NameCN = clientUnitToUpdate.NameCN;
                serverUnitToUpdate.NameEN = clientUnitToUpdate.NameEN;
            }
        }
    }

    //获取服务端与客户端的差集用来同步服务端或客户端不存在的实体
    var exceptServer = serverUnits.Except(clientUnits, new UnitEntityCompare());

    //遍历差集集合
    //由于要修改集合,所以不使用foreach
    for (int i = 0; i < exceptServer.Count(); i++) {
        var item = exceptServer.ElementAt(i);
        //如果本地最后更新时间在数据的更新时间之前,则向客户端添加该数据
        if (!clientShopInfo.LastUpdateDate.HasValue || clientShopInfo.LastUpdateDate < serverShopInfo.LastUpdateDate) {
            using (var helper = new LocalDb.UnitHelper()) {
                helper.AddUnit(item);
            }
        }
        //否则说明数据已从本地库删除,同时从服务端数据库删除
        else {
            Context.RP_Units.Remove(item);
        }
    }

    //获取服务端与客户端的差集用来同步服务端或客户端不存在的实体
    var exceptClient = clientUnits.Except(serverUnits, new UnitEntityCompare());

    //遍历差集集合
    //由于要修改集合,所以不使用foreach
    foreach (var item in exceptClient) {
        //如果本地最后更新时间在数据的更新时间之前,则从客户端移除该数据
        if (clientShopInfo.LastUpdateDate < serverShopInfo.LastUpdateDate) {
            using (var helper = new LocalDb.UnitHelper()) {
                helper.DeleteUnit(item);
            }
        }
        //否则说明将客户端数据添加到服务端
        else {
            Context.RP_Units.Add(item);
        }
    }

    SyncOperations.Remove("Unit");
}
#endregion
posted @ 2011-12-24 01:56 紫色永恒 阅读(...) 评论(...) 编辑 收藏