Repository封装方法
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封装方法的更多相关文章
- js面向对象的封装方法,【案例】
封装方法: /** * @矩形canvas库 * @authors Shimily (275766400@qq.com) * @date 2016-12-28 10:30:51 * @version ...
- Javascript 封装方法
基本封装方法 请看下面的例子: var Person = function(name,age){ this.name = name; this.age = age || "未填写" ...
- [论文笔记] 一种Java遗留系统服务化切分和封装方法 (计算机学报, 2009)
李翔,怀进鹏,曾晋,高鹏. 一种Java遗留系统服务化切分和封装方法. 计算机学报, 32(9), 2009, p1084-1815 (gs:5) 1. 本文研究从Java遗留系统中切分并封装出Web ...
- 分享几个Javascript 封装方法
基本封装方法 请看下面的例子: var Person = function(name,age){ this.name = name; this.age = age || "未填写" ...
- iOS常用的封装方法
做开发也有一段时间了,看了好多大神的代码,总体感觉他们写的代码简洁,好看,然而在对比下我写的代码,混乱,无序,简直不堪入目啊! 总体来说大神们的代码封装的都比较好,对一个项目要重复用到的代码他们都会封 ...
- JavaScrpt常用的封装方法
1.闭包封装.在这个封装方法中,所有的实例成员都共享属性和方法, 使得所有得方法和属性都私有且对象间共享 (function ($) { var Person = function(name) { r ...
- Lua常用封装方法
Lua 获取随机值 --获取随机值,指定上限和下限 function getRandom(min,max) -- 接收一个整数n作为随即序列的种子 math.randomseed(os.time()) ...
- MP实战系列(十二)之封装方法详解(续二)
继续MP实战系列(十一)之封装方法详解(续一)这篇文章之后. 此次要讲的是关于查询. 查询是用的比较多的,查询很重要,好的查询,加上索引如鱼得水,不好的查询加再多索引也是无济于事. 1.selectB ...
- MP实战系列(十一)之封装方法详解(续一)
之前写的封装方法详解,比较简要. 今天我主要讲增加和删除及其修改.查的话得单独再详讲. 增删改查,无论是Java或者C#等等,凡是对数据库操作的都离不开这四个. 一.增加方法讲解 MyBatis Pl ...
随机推荐
- C # socket 实例
同步客户端存储示例 下面的示例程序创建连接到服务器的客户端. 客户端使用一个同步套接字生成,因此,客户端应用程序的执行挂起,直到服务器返回响应. 应用程序将字符串发送到服务器 ...
- PHP和JavaScript中奖概率算法
这是一个经典的概率算法. 现在有数组:[10, 20, 30, 40] . 假设对应中奖几率:特等奖10%,一等奖20%,二等奖30%,三等奖40%,总共100%. 算法开始时,从数组中选出一个值$v ...
- Vue3.0常用代码片段和开发插件
Vue3 Snippets for Visual Studio Code Vue3 Snippets源码 Vue3 Snippets下载 This extension adds Vue3 Code S ...
- F#周报2019年第49期
新闻 宣告.NET Core 3.1 新书:Kevin Avignon的F#提升效率 .NET Core 2.2将在2019年12月23日迎来终结 Visual Studio 16.5预览版1中升级了 ...
- java.security.NoSuchProviderException: no such provider: BC 的问题解决
第一种方式 1.修改以下两个文件 %JDK_Home%\jre\lib\security\java.security %JRE_Home%\jre\lib\security\java.security ...
- JSP + Session Cookie详解
篇幅较大,对JSP进行了非常详细的讲解,并解释了Session和Cookie的实现原理 ,预计看完需要20分钟左右,慢慢享受吧 JSP概述 掌握了servlet后,就可以利用servlet来开发动态页 ...
- luogu P4981 父子
题目背景 上演在各大学男生寝室的日常 :: A :A: "我没带纸,快来厕所救我!" B :B: "叫爸爸." A :A: "爸爸!" .. ...
- git配置文件—— .gitattributes
目录 .gitattributes 文档 1. gitattributes文件以行为单位设置一个路径下所有文件的属性,格式如下: 2. 在gitattributes文件的一行中,一个属性(以text属 ...
- 2018HDU多校二 -F 题 Naive Operations(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6315 In a galaxy far, far away, there are two integer ...
- 【CSS】271- RGB、HSL、Hex网页色彩,看完这篇全懂了
作者:CSS可乐 http://csscoke.com/2015/01/01/rgb-hsl-hex/ 网页使用到的色彩标示方法中,从古早时期大家都在用的16进位码(#000000).RGB色值标示. ...