//----------------------------------------------------------------
// 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. C#利用服务器实现客户端之间通信

    这两天在学习C#,C#高级编程真的是厚厚的一本书QAQ. 昨天看了一下里面的通信部分(其实还没怎么看),看了网上一些人的博客,自己在他们的博客基础上写了一个通信. 先来讲述下我自己对于整个Socket ...

  2. 为什么JAVA的垃圾回收机制无法避免内存泄漏

    一.本文参考:    1.<深入理解java虚拟机 JVM高级特性与最佳实践>    2.http://coderevisited.com/memory-leaks-in-java/   ...

  3. MVC使用x.PagedList分页

    MVC分页 1.Install Package Tools=> NuGet Package Manager=>Manager NuGet Packages of Solution

  4. Javascript优化后的加减乘除(解决js浮点数计算bug)

    function add(a, b) { var c, d, e; try { c = a.toString().split(".")[1].length; } catch (f) ...

  5. H5离线存储

    如何使用 首先,我们建立一个html文件,类似这样: <!DOCTYPE html> <html lang="en" manifest="manifes ...

  6. nginx 启动、重启、关闭

    一.启动 cd usr/local/nginx/sbin./nginx 二.重启 更改配置重启nginx kill -HUP 主进程号或进程号文件路径或者使用cd /usr/local/nginx/s ...

  7. 【Duke-Image】Week_5 Segmentation

    Chapter 10 Image Segmentation 图像分割 10.2.7 Edge Linking and Boundary Detection 边缘连接和边界检测 Global proce ...

  8. css学习笔记 5

    将css引入到html页面中的方法: 用style属性设置样式 用<style>标签设置样式 用<link>标签引入外部样式文件 用@import引入外部样式文件 <li ...

  9. HTTP历程

    原文http://www.ruanyifeng.com/blog/2016/08/http.html 1.HTTP/0.9 HTTP是基于TCP/IP协议的应用层协议.它不涉及数据包传输,主要规定了客 ...

  10. PC端和移动端一些奇葩兼容性问题

    IE10默认在input框中输入内容时会显示一个'X',密码框会显示一个'小眼睛',怎么把这个默认的'X'或者'小眼睛'删除掉. 在password输入框显示一个“小眼睛”的按钮,去掉他的方法如下: ...