用于Silverlight使用RiaService获取服务器端分页数据
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Windows.Input;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.ComponentModel;
using System.ServiceModel.DomainServices.Client;
using System.ServiceModel.DomainServices;
using Microsoft.Windows.Data.DomainServices;
using ZL.Push.Web;
namespace ZL.Push.Web
{
public sealed partial class ZLPushContext : DomainContext
{
public EntityQuery<TEntity> GetQuery<TEntity>(ref string entityName) where TEntity : Entity
{
this.ValidateMethod("Get" + entityName + "Query", null);
return base.CreateQuery<TEntity>("Get" + entityName, null, false, true);
}
}
}
namespace ZL.Push
{
public class ZLViewModel<TEntity> : INotifyPropertyChanged where TEntity : Entity
{
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler(this, e);
}
}
protected void RaisePropertyChanged(string propertyName)
{
this.OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
#endregion
private readonly ZLPushContext _context = null;
private readonly DomainCollectionView<TEntity> _view;
private readonly DomainCollectionViewLoader<TEntity> _loader;
private readonly EntityList<TEntity> _source;
public EntityList<TEntity> source
{
get { return _source; }
}
private bool _canLoad = false;
private bool _refresh_current = false;
private string _searchText = string.Empty;
private string _entityName = string.Empty;
#region View Properties
public Expression<Func<TEntity, bool>> lambda { get; set; }
public bool CanLoad
{
get { return this._canLoad; }
set
{
if (this._canLoad != value)
{
this._canLoad = value;
this.RaisePropertyChanged("CanLoad");
}
}
}
public ICollectionView CollectionView
{
get { return this._view; }
}
#endregion
public ZLViewModel(ZLPushContext context, string entityName, bool refresh_current = true)
{
lambda = null;
_context = context;
_entityName = entityName.Substring(0, 1).ToUpper() + entityName.Substring(1);
_refresh_current = refresh_current;
this._source = new EntityList<TEntity>(this._context.EntityContainer.GetEntitySet<TEntity>());
this._loader = new DomainCollectionViewLoader<TEntity>(
this.LoadEntities,
this.OnLoadEntitiesCompleted);
this._view = new DomainCollectionView<TEntity>(this._loader, this._source);
INotifyCollectionChanged notifyingSortDescriptions =(INotifyCollectionChanged)this.CollectionView.SortDescriptions;
notifyingSortDescriptions.CollectionChanged += (sender, e) => this._view.MoveToFirstPage();
}
public void OnSearch()
{
// This makes sure we refresh even if we're already on the first page
using (this._view.DeferRefresh())
{
// This will lead us to re-query for the total count
this._view.SetTotalItemCount(-1);
this._view.MoveToFirstPage();
}
}
public void Clear()
{
this._source.Source = null;
}
public void AddNoSubmit(ref TEntity tbl)
{
this._source.Add(tbl);
}
public void Add(TEntity tbl, Action<bool> callback = null)
{
this._source.Add(tbl);
this._context.SubmitChanges((op) =>
{
if (op.HasError)
{
//恢复
this._source.Remove(tbl);
op.MarkErrorAsHandled();
System.Windows.MessageBox.Show(op.Error.Message);
}
if (callback != null)
{
callback(!op.HasError);
}
}, false);
}
public void Edit(Action<bool> callback = null)
{
this._context.SubmitChanges((op) =>
{
if (op.HasError)
{
op.MarkErrorAsHandled();
System.Windows.MessageBox.Show(op.Error.Message);
}
if (callback != null)
{
callback(!op.HasError);
}
}, false);
}
public void DeleteNoSubmit(TEntity tbl)
{
this._source.Remove(tbl);
}
public void Delete(TEntity tbl, Action<bool> callback = null)
{
int index = this._source.IndexOf(tbl);
this._source.RemoveAt(index);
this._context.SubmitChanges((op) =>
{
if (op.HasError)
{
// 恢复
this._source.Insert(index, tbl);
op.MarkErrorAsHandled();
System.Windows.MessageBox.Show(op.Error.Message);
}
if (callback != null)
{
callback(!op.HasError);
}
}, false);
}
private LoadOperation<TEntity> LoadEntities()
{
this.CanLoad = false;
EntityQuery<TEntity> query = this._context.GetQuery<TEntity>(ref _entityName);
if (lambda != null)
{
query = query.Where(lambda);
}
// 如果不order by id,下面的SortAndPageBy会报错
var param = Expression.Parameter(typeof(TEntity), "c");
var body = Expression.PropertyOrField(param, "id");
var sortExpression = Expression.Lambda<Func<TEntity, Int32>>(body, param);
query = query.OrderBy(sortExpression);
if (_refresh_current)
{
return this._context.Load<TEntity>(query.SortAndPageBy(this._view), LoadBehavior.RefreshCurrent, false);
}
else
{
return this._context.Load<TEntity>(query.SortAndPageBy(this._view));
}
}
private void OnLoadEntitiesCompleted(LoadOperation<TEntity> op)
{
this.CanLoad = true;
if (op.HasError)
{
op.MarkErrorAsHandled();
System.Windows.MessageBox.Show(op.Error.Message);
}
else if (!op.IsCanceled)
{
this._source.Source = op.Entities;
if (op.TotalEntityCount != -1)
{
this._view.SetTotalItemCount(op.TotalEntityCount);
}
}
}
}
}
使用示例代码:
a) 绑定到datagrid并检索
ZLPushContext _context = new ZLPushContext();
ZLViewModel<tbl_metadata> _vm = new ZLViewModel<tbl_metadata>(_context, "tbl_metadata");
_datagrid.DataContext = _vm;
_datapager.DataContext = _vm;
_vm.lambda = _create_lamda();
_vm.OnSearch();
b) 添加entity
tbl_metadata tbl = new tbl_metadata();
_vm.Add(tbl, (result) =>
{
if (result)
{
}
} );
分享到:
相关推荐
强大的代码生成 Entity Developer提供基于T4类似的模板生成代码框架,针对不同使用情况提供大量预定义的模板,模板化生成上下文,实体,映射,支持流,属性和XML映射,包括持久层感知和持久层无感知实体,支持验证...
easycode模板_entity
Entity Developer提供基于T4类似的模板生成代码框架,针对不同使用情况提供大量预定义的模板,模板化生成上下文,实体,映射,支持流,属性和XML映射,包括持久层感知和持久层无感知实体,支持验证框架等。另外模板...
根据表结构字段生成实体类,private int? keyId; public int? KeyId{get{return keyId;} set{keyId=value;}}
在Spring MVC框架中,HttpEntity和ResponseEntity是两个非常重要的概念,它们主要用于处理HTTP请求和响应。本项目“springMVC-HttpEntity(ResponseEntity)demo”是一个实战演示,展示了如何在Spring MVC应用中使用...
在处理不同架构(X86和X64)时,System.Data.Entity是平台无关的,因为.NET框架本身是跨平台的。这意味着无论是在32位还是64位环境下,只要目标平台与运行时环境匹配,Entity Framework都可以正常工作。不过,需要...
描述中提到的"自己改的支持Mysql的",意味着有开发者或社区成员已经对原版的EntityFramework.Extended进行了修改,使其能够适配MySQL数据库,这通常涉及到对内部代码的调整,以匹配MySQL的特定语法和功能。...
为了适应不同应用场景,Entity Framework Core提供了多个.NET实现的支持,并详细描述了不同的数据库提供程序(如Microsoft SQL Server、SQLite、内存优化表InMemory),以及如何编写自定义的数据库提供程序。...
- 涵盖了如何使用EFCore或EF6进行数据查询操作,包括利用Entity Framework提供的LINQ支持进行数据检索。 7. 保存数据: - 讲述了如何通过Entity Framework添加、修改或删除数据以及保存这些更改到数据库中。 8. ...
在进行毕业设计时,Entity是数据模型中的一个重要概念,它代表了系统中具有独立存在意义的对象或者实体。...希望这个“毕业设计模板entity”能够帮助到同学们,为你们的毕业设计之路提供有力的支持。
SQLite数据库创建Entity Framework数据模型支持程序是一个用于Visual Studio 2010的工具,它使得开发者能够更加便捷地在SQLite数据库上构建数据模型。Entity Framework是Microsoft推出的一个面向对象的ORM(对象关系...
在本篇详细知识点讲解中,将基于给定文件信息,深入探讨Entity Framework(实体框架)中Code First方法的相关知识点。根据文件标题《Programming Entity Framework DbContext》和描述,该文件应该是关于Entity ...
Entity Framework支持多种查询技术,包括: - LINQ to Entities:通过LINQ(语言集成查询)可以非常方便地在概念模型上执行查询。LINQ提供编译时类型检查,能够有效地减少运行时错误。 - Entity SQL:一种不依赖于...
EntityFrameworkCore是一个强大的ORM(对象关系映射)框架,专为.NET Core和.NET Framework设计,由微软维护。它使得.NET开发者无需直接操作SQL语句,就能通过C#代码与数据库进行交互,极大地提高了开发效率。Entity...
Entity Framework (EF) 是微软提供的一款强大的对象关系映射(ORM)框架,它允许开发者使用.NET语言(如C#或VB.NET)来操作数据库,而无需编写大量的SQL语句。在.NET开发中,EF极大地提高了开发效率,因为它将数据...
- **兼容性问题**:在不同数据库系统之间的兼容性问题仍需注意,尤其是对于较旧版本的数据库支持。 通过以上内容,我们对 Entity Framework 有了较为全面的认识,无论是从基本概念还是到高级特性的应用,都能帮助...
### Entity Framework 4 In Action:全面解析与应用实践 #### 一、书籍概述与背景介绍 《Entity Framework 4 In Action》是一本深入探讨Entity Framework 4(简称EF4)的权威指南,由Stefano Mostarda、Marco De ...
它支持ADO.NET Entity Data Model(EDM),这是一个统一的数据模型,可以代表各种不同类型的数据库。通过EF,开发者可以更加专注于业务逻辑,而不是底层数据存储细节。 二、工作流程 1. **Code First**:这是一种...
8. **事务支持**:Entity Framework支持事务处理,确保数据的一致性和完整性。 9. **迁移功能**:虽然4.1版本可能没有完整的Code First Migrations功能,但后续版本引入了这一特性,允许开发者在不丢失已有数据的...