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

作者:紫色永恒
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
分类:
Silverlight
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2009-12-24 [Silverlight]山寨方法->扩展方法->Behavior以及一些遗憾