• 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
    

    作者:紫色永恒

    出处:http://024hi.cnblogs.com/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利

  • 相关阅读:
    求职准备:大一到大三,做好五件大事!
    研发过程管理导图第一稿(转)
    【推荐收藏】Visual Studio 插件库(转)
    提高C#编程水平的50个要点
    VC++和Matlab
    matlab混合编程向导(vc,vb,.net...)
    Matlab多线程运算的问题
    产生的DLL (VS2005, MATLAB7.5, mwArray)
    matlabsum函数用法
    SWFUpload V2.2.0 说明文档
  • 原文地址:https://www.cnblogs.com/024hi/p/2300087.html
Copyright © 2020-2023  润新知