1.创建依赖的实体类

/// <summary>

/// 泛型实体基类
/// </summary>
/// <typeparam name="TPrimaryKey">主键类型</typeparam>
public abstract class Entity<TPrimaryKey>
{
/// <summary>
/// 主键
/// </summary>
public virtual TPrimaryKey Id { get; set; }
} /// <summary>
/// 定义默认主键类型为int的实体基类
/// </summary>
public abstract class Entitys : Entity<int>
{ }

2.定义封装的接口

public interface IRepository<T> where T : Entitys
{ //异步保存保存信息
Task<int> SaveChangesAsync();
void SaveChanges(); //添加实体类
T Add(T data); //批量添加实体类
IEnumerable<T> AddRange(IEnumerable<T> entitys); //异步批量添加实体类
Task<IEnumerable<T>> AddRangeAsync(IEnumerable<T> entitys); bool Remove(T data); bool RemoveRange(IEnumerable<T> entitys); bool Update(T data); int Max(Expression<Func<T, int>> whereLamdba); /// <summary>
/// 查询记录数
/// </summary>
/// <param name="whereLambda">查询表达式</param>
/// <returns></returns>
int Count(Expression<Func<T, bool>> whereLambda); /// <summary>
/// 是否存在
/// </summary>
/// <param name="anyLambda">查询表达式</param>
/// <returns></returns>
bool Exist(Expression<Func<T, bool>> anyLambda); /// <summary>
/// 得到数据集
/// </summary>
/// <returns></returns>
DbSet<T> Set(); T Find(Expression<Func<T, bool>> whereLambda); /// <summary>
/// 查找数据列表
/// </summary>
/// <param name="whereLamdba">查询表达式</param>
/// <param name="orderName">排序名称</param>
/// <param name="isAsc">isAsc</param>
/// <returns></returns>
IQueryable<T> FindList(Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc);
/// <summary>
/// sql查找数据列表
/// </summary>
/// <param name="sql"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="totalRecord"></param>
/// <param name="whereLamdba"></param>
/// <param name="orderName"></param>
/// <param name="isAsc"></param>
/// <returns></returns>
IQueryable<T> FindPageListFromsql(int pageIndex, int pageSize, out int totalRecord, string sql, string orderName, bool isAsc);
/// <summary>
/// 查找分页数据列表
/// </summary>
/// <param name="pageIndex">当前页</param>
/// <param name="pageSize">每页记录数</param>
/// <param name="totalRecord">总记录数</param>
/// <param name="whereLamdba">查询表达式</param>
/// <param name="orderName">排序名称</param>
/// <param name="isAsc">是否升序</param>
/// <returns></returns>
IQueryable<T> FindPageList(int pageIndex, int pageSize, out int totalRecord, Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc); IQueryable<T> FromSql(string sql); /// <summary>
/// 操作数据库
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
int ExecuteSqlCommand(string sql);
}

3 .实现接口方法

public class Repository<T> : IRepository<T> where T : Entitys
{
protected virtual StudyDbContext nWriteContext { get; set; }
protected virtual StudyDbContext nReadContext { get; set; } public Repository(IServiceProvider serviceProvider, StudyDbContext studyDbContext)
{
this.nWriteContext = studyDbContext;
this.nReadContext = this.nWriteContext;
} public void SaveChanges()
{
nWriteContext.SaveChanges();
}
public async Task<int> SaveChangesAsync()
{
return await nWriteContext.SaveChangesAsync();
} public T Add(T entity)
{
nWriteContext.Entry<T>(entity).State = EntityState.Added;
nWriteContext.SaveChanges();
return entity;
} public IEnumerable<T> AddRange(IEnumerable<T> entitys)
{
foreach (var entity in entitys)
{
nWriteContext.Entry<T>(entity).State = EntityState.Added;
}
nWriteContext.SaveChanges();
return entitys;
}
public async Task<IEnumerable<T>> AddRangeAsync(IEnumerable<T> entitys)
{
foreach (var entity in entitys)
{
nWriteContext.Entry<T>(entity).State = EntityState.Added;
}
await nWriteContext.SaveChangesAsync();
return entitys;
} public int Count(Expression<Func<T, bool>> predicate)
{
//return nReadContext.Set<T>().Count(predicate);
return nReadContext.Set<T>().Count(predicate);
} public bool Update(T entity)
{
nWriteContext.Set<T>().Attach(entity);
nWriteContext.Entry<T>(entity).State = EntityState.Modified;
return nWriteContext.SaveChanges() > ;
} public bool Remove(T entity)
{
nWriteContext.Set<T>().Attach(entity);
nWriteContext.Entry<T>(entity).State = EntityState.Deleted;
return nWriteContext.SaveChanges() > ;
} public bool RemoveRange(IEnumerable<T> entitys)
{
foreach (var entity in entitys)
{
nWriteContext.Set<T>().Attach(entity);
nWriteContext.Entry<T>(entity).State = EntityState.Deleted;
}
return nWriteContext.SaveChanges() > ;
} public bool Exist(Expression<Func<T, bool>> anyLambda)
{
return nReadContext.Set<T>().Any(anyLambda); //Read
} public T Find(Expression<Func<T, bool>> whereLambda)
{
T _entity = nReadContext.Set<T>().FirstOrDefault<T>(whereLambda);//Read
return _entity;
} public DbSet<T> Set()
{
//var type = DbSlaveType.master;
//if (type == DbSlaveType.master)
//{
return nWriteContext.Set<T>();
//}
//else
//{
// return nReadContext.Set<T>();//read
//}
} public IQueryable<T> FindList(Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc)
{
var _list = nReadContext.Set<T>().Where<T>(whereLamdba); //read
_list = OrderBy(_list, orderName, isAsc);
return _list;
} public IQueryable<T> FindPageList(int pageIndex, int pageSize, out int totalRecord, Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc)
{
var _list = nReadContext.Set<T>().Where<T>(whereLamdba); //read
totalRecord = _list.Count();
_list = OrderBy(_list, orderName, isAsc).Skip<T>((pageIndex - ) * pageSize).Take<T>(pageSize);
return _list;
} public IQueryable<T> FindPageListFromsql(int pageIndex, int pageSize, out int totalRecord, string sql, string orderName, bool isAsc)
{
var _list = nWriteContext.Set<T>().FromSql(sql); //read
totalRecord = _list.Count();
_list = OrderBy(_list, orderName, isAsc).Skip<T>((pageIndex - ) * pageSize).Take<T>(pageSize);
return _list;
}
/// <summary>
/// 排序
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="source">原IQueryable</param>
/// <param name="propertyName">排序属性名</param>
/// <param name="isAsc">是否正序</param>
/// <returns>排序后的IQueryable<T></returns>
private IQueryable<T> OrderBy(IQueryable<T> source, string propertyName, bool isAsc)
{
if (source == null)
{
//throw new ArgumentNullException("source", "不能为空");
return null;
}
if (string.IsNullOrEmpty(propertyName)) return source;
var _parameter = Expression.Parameter(source.ElementType);
var _property = Expression.Property(_parameter, propertyName);
if (_property == null)
{
// throw new ArgumentNullException("propertyName", "属性不存在");
return null;
}
var _lambda = Expression.Lambda(_property, _parameter);
var _methodName = isAsc ? "OrderBy" : "OrderByDescending";
var _resultExpression = Expression.Call(typeof(Queryable), _methodName, new Type[] { source.ElementType, _property.Type }, source.Expression, Expression.Quote(_lambda));
return source.Provider.CreateQuery<T>(_resultExpression);
} public int Max(Expression<Func<T, int>> whereLamdba)
{
return nWriteContext.Set<T>().Select(whereLamdba).Max(); //read
} public IQueryable<T> FromSql(string sql)
{
return nWriteContext.Set<T>().FromSql(sql); //read
} public int ExecuteSqlCommand(string sql)
{
return nWriteContext.Database.ExecuteSqlCommand(sql);
} }

Repository封装方法的更多相关文章

  1. js面向对象的封装方法,【案例】

    封装方法: /** * @矩形canvas库 * @authors Shimily (275766400@qq.com) * @date 2016-12-28 10:30:51 * @version ...

  2. Javascript 封装方法

    基本封装方法 请看下面的例子: var Person = function(name,age){ this.name = name; this.age = age || "未填写" ...

  3. [论文笔记] 一种Java遗留系统服务化切分和封装方法 (计算机学报, 2009)

    李翔,怀进鹏,曾晋,高鹏. 一种Java遗留系统服务化切分和封装方法. 计算机学报, 32(9), 2009, p1084-1815 (gs:5) 1. 本文研究从Java遗留系统中切分并封装出Web ...

  4. 分享几个Javascript 封装方法

    基本封装方法 请看下面的例子: var Person = function(name,age){ this.name = name; this.age = age || "未填写" ...

  5. iOS常用的封装方法

    做开发也有一段时间了,看了好多大神的代码,总体感觉他们写的代码简洁,好看,然而在对比下我写的代码,混乱,无序,简直不堪入目啊! 总体来说大神们的代码封装的都比较好,对一个项目要重复用到的代码他们都会封 ...

  6. JavaScrpt常用的封装方法

    1.闭包封装.在这个封装方法中,所有的实例成员都共享属性和方法, 使得所有得方法和属性都私有且对象间共享 (function ($) { var Person = function(name) { r ...

  7. Lua常用封装方法

    Lua 获取随机值 --获取随机值,指定上限和下限 function getRandom(min,max) -- 接收一个整数n作为随即序列的种子 math.randomseed(os.time()) ...

  8. MP实战系列(十二)之封装方法详解(续二)

    继续MP实战系列(十一)之封装方法详解(续一)这篇文章之后. 此次要讲的是关于查询. 查询是用的比较多的,查询很重要,好的查询,加上索引如鱼得水,不好的查询加再多索引也是无济于事. 1.selectB ...

  9. MP实战系列(十一)之封装方法详解(续一)

    之前写的封装方法详解,比较简要. 今天我主要讲增加和删除及其修改.查的话得单独再详讲. 增删改查,无论是Java或者C#等等,凡是对数据库操作的都离不开这四个. 一.增加方法讲解 MyBatis Pl ...

随机推荐

  1. RPM命令执行失败:bash: rpm: 未找到命令...

    出现错误截图如下: 这是由于误操作导致rpm文件缺失导致 将另一台完好的服务器上RPM文件及缺失文件上传至异常服务器上即可修复 异常服务器A:192.168.1.230 完好服务器B: 任意 服务器B ...

  2. 使用vuecli3发布npm包

    一.使用vuecli3创建项目 vue create svgicon 二.修改目录,开发组件前的准备 把src目录改为examples作为查看组件的演示目录,新建packages目录作为组件编写的目录 ...

  3. 【Android - IPC】之ContentProvider简介

    1.Content Provider简介 Content Provider是Android中提供的一种专门用于不同应用之间进行数据共享的方式,从这一点来看,它天生就适合IPC(Inter-Proces ...

  4. Oracle temp table

    Tow kinds of temp table data keep method. One is delete when commit Anothe one is preseve when commi ...

  5. jQuery基于json与cookie实现购物车的方法

    /** * 添加商品及数量到购物车cookie中,返回当前商品在cookie中的总数 */ function AddToShoppingCar(id, num, type) { var _num = ...

  6. PAT(甲级)2018年冬季考试

    1152 Google Recruitment 思路:判断素数 #include<bits/stdc++.h> using namespace std; const int maxn = ...

  7. 关于javascript中=的返回值

    今天看了一段代码,大概是这样的: function test(){ a=4; b=5; return b=a; } test();//返回? 返回值是多少呢?运行结果是4 这可以理解为将a的值赋给b以 ...

  8. 基于webpack实现多html页面开发框架四 自动写入多入口,自动插入多个htmlWebpackPlugin插件

    一.解决什么问题      1.手写页面多入口,一个一个输入太麻烦,通过代码实现      2.手写多个htmlWebpackPlugin插件太麻烦,通过代码实现 二.多入口代码实现 //读取所有.j ...

  9. 洛谷 题解 P5535 【【XR-3】小道消息】

    我又双叒叕被包菜辣! P5535 [XR-3]小道消息(这道题是个大水题 在题干中这位良心的作者就提醒了我们: 你可能需要用到的定理--伯特兰-切比雪夫定理. 那么什么是伯特兰-切比雪夫定理? 我也不 ...

  10. luogu P2515 [HAOI2010]软件安装 |Tarjan+树上背包

    题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为MM计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但 ...