您的位置:首页 > 编程语言

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

2011-12-24 01:56 344 查看
#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐