`
longyw
  • 浏览: 5718 次
文章分类
社区版块
存档分类
最新评论

支持不同Entity的DomainCollectionView模版

阅读更多
用于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)
                        {
                        }
                    } );
分享到:
评论

相关推荐

    Devart Entity Developer v6.4.719 Professional破解版,支持vs2019

    强大的代码生成 Entity Developer提供基于T4类似的模板生成代码框架,针对不同使用情况提供大量预定义的模板,模板化生成上下文,实体,映射,支持流,属性和XML映射,包括持久层感知和持久层无感知实体,支持验证...

    easycode模板_entity

    easycode模板_entity

    Devart Entity Developer v6.0.67 Professional破解版

    Entity Developer提供基于T4类似的模板生成代码框架,针对不同使用情况提供大量预定义的模板,模板化生成上下文,实体,映射,支持流,属性和XML映射,包括持久层感知和持久层无感知实体,支持验证框架等。另外模板...

    codesmith 实体类Entity模板

    根据表结构字段生成实体类,private int? keyId; public int? KeyId{get{return keyId;} set{keyId=value;}}

    springMVC-HttpEntity(ResponseEntity)demo

    在Spring MVC框架中,HttpEntity和ResponseEntity是两个非常重要的概念,它们主要用于处理HTTP请求和响应。本项目“springMVC-HttpEntity(ResponseEntity)demo”是一个实战演示,展示了如何在Spring MVC应用中使用...

    System.Data.Entity

    在处理不同架构(X86和X64)时,System.Data.Entity是平台无关的,因为.NET框架本身是跨平台的。这意味着无论是在32位还是64位环境下,只要目标平台与运行时环境匹配,Entity Framework都可以正常工作。不过,需要...

    EntityFramework.Extended支持MySql数据库

    描述中提到的"自己改的支持Mysql的",意味着有开发者或社区成员已经对原版的EntityFramework.Extended进行了修改,使其能够适配MySQL数据库,这通常涉及到对内部代码的调整,以匹配MySQL的特定语法和功能。...

    Entity Framework官方中文教程

    为了适应不同应用场景,Entity Framework Core提供了多个.NET实现的支持,并详细描述了不同的数据库提供程序(如Microsoft SQL Server、SQLite、内存优化表InMemory),以及如何编写自定义的数据库提供程序。...

    Entity Framework orm教程

    - 涵盖了如何使用EFCore或EF6进行数据查询操作,包括利用Entity Framework提供的LINQ支持进行数据检索。 7. 保存数据: - 讲述了如何通过Entity Framework添加、修改或删除数据以及保存这些更改到数据库中。 8. ...

    毕业设计模板entity

    在进行毕业设计时,Entity是数据模型中的一个重要概念,它代表了系统中具有独立存在意义的对象或者实体。...希望这个“毕业设计模板entity”能够帮助到同学们,为你们的毕业设计之路提供有力的支持。

    SQLite数据库创建EntityFramework数据模型支持程序

    SQLite数据库创建Entity Framework数据模型支持程序是一个用于Visual Studio 2010的工具,它使得开发者能够更加便捷地在SQLite数据库上构建数据模型。Entity Framework是Microsoft推出的一个面向对象的ORM(对象关系...

    Programming Entity Framework DbContext

    在本篇详细知识点讲解中,将基于给定文件信息,深入探讨Entity Framework(实体框架)中Code First方法的相关知识点。根据文件标题《Programming Entity Framework DbContext》和描述,该文件应该是关于Entity ...

    Entity_Framework_学习.pdf

    Entity Framework支持多种查询技术,包括: - LINQ to Entities:通过LINQ(语言集成查询)可以非常方便地在概念模型上执行查询。LINQ提供编译时类型检查,能够有效地减少运行时错误。 - Entity SQL:一种不依赖于...

    EntityFrameworkCore.zip

    EntityFrameworkCore是一个强大的ORM(对象关系映射)框架,专为.NET Core和.NET Framework设计,由微软维护。它使得.NET开发者无需直接操作SQL语句,就能通过C#代码与数据库进行交互,极大地提高了开发效率。Entity...

    EntityFramework.SqlServer_EntityFramework_

    Entity Framework (EF) 是微软提供的一款强大的对象关系映射(ORM)框架,它允许开发者使用.NET语言(如C#或VB.NET)来操作数据库,而无需编写大量的SQL语句。在.NET开发中,EF极大地提高了开发效率,因为它将数据...

    ADO.NET EntityFramework 完整版教程(从初级到高级)

    - **兼容性问题**:在不同数据库系统之间的兼容性问题仍需注意,尤其是对于较旧版本的数据库支持。 通过以上内容,我们对 Entity Framework 有了较为全面的认识,无论是从基本概念还是到高级特性的应用,都能帮助...

    Entity Framework 4 In Action

    ### Entity Framework 4 In Action:全面解析与应用实践 #### 一、书籍概述与背景介绍 《Entity Framework 4 In Action》是一本深入探讨Entity Framework 4(简称EF4)的权威指南,由Stefano Mostarda、Marco De ...

    entity framework 教程下载

    它支持ADO.NET Entity Data Model(EDM),这是一个统一的数据模型,可以代表各种不同类型的数据库。通过EF,开发者可以更加专注于业务逻辑,而不是底层数据存储细节。 二、工作流程 1. **Code First**:这是一种...

    EntityFramework.dll

    8. **事务支持**:Entity Framework支持事务处理,确保数据的一致性和完整性。 9. **迁移功能**:虽然4.1版本可能没有完整的Code First Migrations功能,但后续版本引入了这一特性,允许开发者在不丢失已有数据的...

Global site tag (gtag.js) - Google Analytics