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://www.cnblogs.com/024hi/archive/2011/12/24/2300087.html,如需转载请自行联系原作者








相关文章
|
6月前
|
SQL 关系型数据库 MySQL
这个错误可能是由于Flink CDC在处理MySQL和SQL Server之间的数据同步时遇到了问题
这个错误可能是由于Flink CDC在处理MySQL和SQL Server之间的数据同步时遇到了问题
114 1
|
canal SQL 关系型数据库
Canal 数据同步(客户端代码编写) | 学习笔记
快速学习 Canal 数据同步(客户端代码编写)
|
SQL Oracle 关系型数据库
|
API
ArcGIS API for Silverlight代码中使用Template模板
       在项目开发中,会遇到点选中聚焦闪烁效果,但是因为在使用Symbol的时候,会设置一定的OffSetX和OffSetY,所以聚焦闪烁的时候,有些情况下,会出现闪烁点的位置和Symbol的位置不重叠现象,下面的方法就是解决这个问题的。
710 0
|
前端开发 计算机视觉 机器学习/深度学习
Silverlight图片验证码生成代码
在Silverlight的登录页面中经常用到输入验证码,怎么生成的呢,其实和.NET生成差不多,以下简单介绍一种: 1、在Silverlight项目下建立一个类IndentifyCodeClass.
606 0
|
前端开发
Silverlight跑马灯效果实现代码
首先定义一个UC_Pic.xaml的文件      UC_Pic.xaml.cs文件内容如下: using System;using System.
805 0
|
SQL 存储 数据库
利用SQL Server复制技术实现数据同步更新
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/2563079 利用SQL Server复制技术实现数据同步更新 Microsoft SQL Server 2000复制的概念:在数据库之间对数据和数据库对象进行复制和分发并进行同步以确保其一致性的一组技术。
1034 0