//----------------------------------------------------------------
// Copyright (C) 2013 河南禄恒软件科技有限公司
//
// 功能描述:实体框架数据仓储的操作接口,包含增删改查接口
//
//----------------------------------------------------------------
using System;
using System.Data.Entity.Infrastructure;
using System.Data.Objects;
using System.Linq;
using System.Linq.Expressions;
using System.Data.Entity;
using EntityFramework.Extensions;

namespace Qmvc.DataAccess.EntityRepository
{
    /// <summary>
    ///     实体框架数据仓储的基类
    /// </summary>
    /// <typeparam name="TContext">提供用于查询和使用对象形式的实体数据的功能的实体上下文</typeparam>
    /// <typeparam name="T">表示用于执行创建、读取、更新和删除操作的类型化实体集</typeparam>
    public abstract class EntityRepositoryBase<TContext, T> : IRepository<T>
        where TContext : DbContext
        where T : class, new()
    {
        /// <summary>
        ///     表示用于执行创建、读取、更新和删除操作的类型化实体集
        /// </summary>
        private DbSet<T> _dbSet;

/// <summary>
        ///
        /// </summary>
        protected EntityRepositoryBase()
        {
            IsOwnContext = false;
        }

/// <summary>
        ///     提供用于查询和使用对象形式的实体数据的功能的实体上下文
        /// </summary>
        protected virtual TContext Context { get; set; }

/// <summary>
        ///     表示用于执行创建、读取、更新和删除操作的类型化实体集
        /// </summary>
        protected virtual DbSet<T> Set
        {
            get { return _dbSet ?? (_dbSet = Context.Set<T>()); }
            set { _dbSet = value; }
        }

/// <summary>
        ///     是否拥有上下文
        /// </summary>
        protected bool IsOwnContext { get; set; }

/// <summary>
        ///     返回一个 System.Linq.IQueryable
        /// </summary>
        /// <returns>一个 System.Linq.IQueryable,包含满足由 predicate 指定的条件的元素</returns>
        public virtual IQueryable<T> All()
        {
            return Set.Where(p => true);
        }

/// <summary>
        ///     返回一个 System.Linq.IQueryable,包含满足由 predicate 指定的条件的元素
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <returns>一个 System.Linq.IQueryable,包含满足由 predicate 指定的条件的元素</returns>
        public virtual IQueryable<T> Where(Expression<Func<T, bool>> predicate)
        {
            var query = Set.Where(predicate);
            return query;
        }

/// <summary>
        ///     返回一个 System.Linq.IQueryable<T>,包含满足由 predicate 和 分页参数 指定的条件的元素,并根据键对其元素排序</T>
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <param name="pageSize">页大小</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="orderingSelector">用于从元素中提取键的函数</param>
        /// <param name="orderBy">排序类型</param>
        /// <param name="recCount">总数量</param>
        /// <returns>一个 System.Linq.IQueryable<T/>,包含满足由 predicate 和 分页参数 指定的条件的元素,并根据键对其元素排序</returns>
       
public virtual IQueryable<T>
Where<TKey>(Expression<Func<T, bool>> predicate, int
pageSize, int pageIndex,
            Expression<Func<T, TKey>> orderingSelector, OrderingOrders orderBy, out int recCount)
        {
            IQueryable<T> query = Set.Where(predicate);
            recCount = query.Count();
            query = orderBy == OrderingOrders.ASC
                ? query.OrderBy(orderingSelector).AsQueryable()
                : query.OrderByDescending(orderingSelector).AsQueryable();

query = query.Skip((pageIndex - 1) * pageSize).Take(pageSize);

return query;
        }

/// <summary>
        ///     返回一个 System.Linq.IQueryable<T/>,包含满足由 predicate 指定的条件的元素,并根据键对其元素排序
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <param name="orderingSelector">用于从元素中提取键的函数</param>
        /// <param name="orderBy">排序</param>
        /// <returns>一个 System.Linq.IQueryable<T/>,包含满足由 predicate 指定的条件的元素,并根据键对其元素排序</returns>
        public virtual IQueryable<T> Where<TKey>(Expression<Func<T, bool>> predicate,
            Expression<Func<T, TKey>> orderingSelector, OrderingOrders orderBy)
        {
            IQueryable<T> query = Set.Where(predicate);
            query = orderBy == OrderingOrders.ASC
                ? query.OrderBy(orderingSelector).AsQueryable()
                : query.OrderByDescending(orderingSelector).AsQueryable();
            return query;
        }

/// <summary>
        /// 通过SQL查询数据结果
        /// </summary>
        /// <typeparam name="TKey"></typeparam>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public virtual IQueryable<T> Where<TKey>(string sql, params object[] parameters)
        {
            IQueryable<T> query = Set.SqlQuery(sql, parameters).AsQueryable();
            return query;
        }

/// <summary>
        ///     返回序列的唯一元素;如果该序列并非恰好包含一个元素,则会引发异常。
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <returns>单个元素</returns>
        public virtual T Single(Expression<Func<T, bool>> predicate)
        {
            return Set.Single(predicate);
        }

/// <summary>
        ///     返回序列的唯一元素;如果该序列并非恰好包含一个元素,则会引发异常。
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <param name="orderingSelector">用于从元素中提取键的函数</param>
        /// <param name="orderBy">排序</param>
        /// <returns>单个元素</returns>
       
public virtual T Single<TKey>(Expression<Func<T,
bool>> predicate, Expression<Func<T, TKey>>
orderingSelector,
            OrderingOrders orderBy)
        {
            IQueryable<T> query = Set.Where(predicate);
            query = orderBy == OrderingOrders.ASC
                ? query.OrderBy(orderingSelector).AsQueryable()
                : query.OrderByDescending(orderingSelector).AsQueryable();
            return query.Single();
        }

/// <summary>
        ///     返回序列中满足指定条件的唯一元素;如果序列中不包含任何元素,则返回默认值
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <returns>唯一元素</returns>
        public virtual T FirstOrDefault(Expression<Func<T, bool>> predicate)
        {
            return Set.FirstOrDefault(predicate);
        }

/// <summary>
        ///     返回序列中满足指定条件的唯一元素;如果序列中不包含任何元素,则返回默认值
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <param name="orderingSelector">用于从元素中提取键的函数</param>
        /// <param name="orderBy">排序</param>
        /// <returns>唯一元素</returns>
        public virtual T FirstOrDefault<TKey>(Expression<Func<T, bool>> predicate,
            Expression<Func<T, TKey>> orderingSelector, OrderingOrders orderBy)
        {
            IQueryable<T> query = Set.Where(predicate);
            query = orderBy == OrderingOrders.ASC
                ? query.OrderBy(orderingSelector).AsQueryable()
                : query.OrderByDescending(orderingSelector).AsQueryable();
            return query.FirstOrDefault();
        }

/// <summary>
        ///     返回指定序列中满足条件的元素数量
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <returns>元素数量</returns>
        public virtual int Count(Expression<Func<T, bool>> predicate)
        {
            return Set.Count(predicate);
        }

/// <summary>
        ///     将对象添加到当前实体集中的对象上下文;如果 IsOwnContex == true,将对象保存到数据源
        /// </summary>
        /// <param name="entity">实体对象</param>
        /// <returns>操作是否成功</returns>
        public virtual bool Add(T entity)
        {
            bool isSucceed;

Set.Add(entity);

if (IsOwnContext)
                isSucceed = Context.SaveChanges() > 0;
            else
                isSucceed = true;

return isSucceed;
        }

/// <summary>
        ///     将对象标记为待删除;如果 IsOwnContex == true,将对象保存到数据源
        /// </summary>
        /// <param name="entity">实体对象</param>
        /// <returns>操作是否成功</returns>
        public virtual bool Delete(T entity)
        {
            bool isSucceed;

Set.Remove(entity);

if (IsOwnContext)
                isSucceed = Context.SaveChanges() > 0;
            else
                isSucceed = true;

return isSucceed;
        }

/// <summary>
        ///     将满足 predicate 指定的条件的元素对象标记为待删除;
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <returns>操作是否成功</returns>
        public virtual bool Delete(Expression<Func<T, bool>> predicate)
        {
            return Set.Where(predicate).Delete() > 0;
        }

/// <summary>
        ///     将满足 predicate 指定的条件的元素对象更新为满足 updatePredicate 条件的属性;
        /// </summary>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数</param>
        /// <param name="updatePredicate">用于构建对象的函数</param>
        /// <returns>操作是否成功</returns>
       
public virtual bool Update(Expression<Func<T, bool>>
predicate, Expression<Func<T, T>> updatePredicate)
        {
            return Set.Update(predicate, updatePredicate) > 0;
        }

/// <summary>
        ///
        /// </summary>
        public void Dispose()
        {
            if ((IsOwnContext) && (Context != null))
            {
                Context.Dispose();
            }
            GC.SuppressFinalize(this);
        }

/// <summary>
        ///     临时把实休对象保存在管理对象中
        /// </summary>
        /// <param name="entity"></param>
        public virtual void AddEntity(T entity)
        {
            Set.Add(entity);
        }
       
        /// <summary>
        ///     将所有更新保存到数据源并重置对象上下文中的更改跟踪。
        /// </summary>
        /// <returns>
        ///     在调用 System.Data.Objects.ObjectContext.SaveChanges() 时处于
        ///     System.Data.EntityState.Added、System.Data.EntityState.Modified或 System.Data.EntityState.Deleted 状态的对象数。
        /// </returns>
        public int SaveChanges()
        {
            return Context.SaveChanges();
        }
    }
}

转自:http://www.cnblogs.com/henanluheng/p/3785596.html

EF实体框架数据操作基类(转)的更多相关文章

  1. BIM工程信息管理系统-EF实体框架数据操作基类

    EF实体框架数据操作基类主要是规范增.改.查.分页.Lambda表达式条件处理,以及异步操作等特性,这样能够尽可能的符合基类这个特殊类的定义,实现功能接口的最大化重用和统一. 1.程序代码 /// & ...

  2. EF实体框架数据操作接口(转)

    //----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司 ...

  3. EF实体框架之CodeFirst一

    对于SQL Server.MySql.Oracle等这些传统的数据库,基本都是关系型数据库,都是体现实体与实体之间的联系,在以前开发时,可能先根据需求设计数据库,然后在写Model和业务逻辑,对于Mo ...

  4. EF实体框架之CodeFirst四

    在EF实体框架之CodeFirst二中也提到数据库里面一般包括表.列.约束.主外键.级联操作.实体关系(E-R图).存储过程.视图.锁.事务.数据库结构更新等.前面几篇博客把表.存储过程.视图这些算是 ...

  5. BaseDAL最牛数据层基类2

    using System; using System.Data.Entity; using System.Linq; using System.Threading.Tasks; using Syste ...

  6. EF实体框架处理实体之间关联关系与EF延迟机制(下)

    在数据库中,表与表之间可能存在多种联系,比如,一对多,多对多的关系.当我们使用逻辑外键在数据库建立两张表之间的关系的时候,我们使用EF实体框架 必然也会将这种关系映射到我们的实体关系中来.所以,在我们 ...

  7. 【MVC 1】MVC+EF实体框架—原理解析

    导读:在之前,我们学过了三层框架,即:UI.BLL.DAL.我们将页面显示.逻辑处理和数据访问进行分层,避免了一层.两层的混乱.而后,我们又在经典三层的基础上,应用设计模式:外观.抽象工厂+反射,使得 ...

  8. 【EF 1】EF实体框架 原理+实例

    一.知识回顾 到目前为止,自己学到的链接数据库操作已经经历了几个阶段,分别是:学生信息管理和(第一次)机房收费时的直接连接数据库操作表格,然后是机房个人重构中应用的操作实体,在其中还利用了一个很重要的 ...

  9. BaseDAL数据层基类1

    /// <summary> /// EF数据库操作基类 /// </summary> /// <typeparam name="T"></ ...

随机推荐

  1. java时间段分成小段存储

    package testThread; import java.text.ParseException; import java.text.SimpleDateFormat; import java. ...

  2. PHP Fatal Error: call to undefined function mysql_connect() [duplicate]

    You shouldn't use mysql_* functions to start with. They are deprecated as of PHP 5.5. Use mysqli or ...

  3. 121. Best Time to Buy and Sell Stock

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  4. ireport5.6+jasperreport6.3开发(二)--web开发的配置

    ireport5.6只能编译出*.jasper的报表包,最终报表需要被输出为一个doc html pdf excel等文件,这时就需要jasperreport6.5的库进行配合了. jasperrep ...

  5. java对国际化的支持

    国际化的英文为Internationalization,这个也太长了,所以它又称为I18n(英文单词 internationalization的首末字符i和n,18为中间的字符数). 除了i18n还有 ...

  6. angular遇到问题

    一.一个js中只有一个angunlar.module,但可以有多个controller,从而控制多个不同的作用域,每个作用域都有独立的$scope.不同作用域之间又有$rootScope这个桥梁 二. ...

  7. ActiveReport 同一单元格内图片跟文字按条件显示

    ActiveReports支持提供Image控件来显示图片素材,Image控件的值可以为图像的二进制流,图像路径,或url等:而在很多情况下,图片是签名扫描文件,并不会一直有值.如果图片的值为空,则显 ...

  8. stopping NetworkManager daemon failed

    1 初次安装NetworkManager时发现,无法将这个服务关闭 2 上网找了一圈,也没找到原因 3 重启服务器后就能正常关闭了 4 将该服务删除重装也能正常关闭 5 下回重装系统时再观察一下

  9. 用computed返回this.$store.state.count,store更改了,但是computed没有调用

    今天出现了这个问题,store更新了,你computed为啥不调用呢??? 另一个.vue更新了state,这个的computed就监听不到了么? 是用这种格式更新的this.$store.commi ...

  10. gulp教程之gulp-rev-append

    简介: 使用gulp-rev-append给页面的引用添加版本号,清除页面引用缓存. 1.安装nodejs/全局安装gulp/项目安装gulp/创建package.json和gulpfile.js文件 ...