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 ...
随机推荐
- 在React项目中添加ESLint
1. 安装eslint npm install eslint --save-dev // 或者 yarn add eslint --dev 2. 初始化配置文件 npx eslint --init / ...
- 堆模板(STL版)
题目描述 如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数 输入输出格式 输入格式: ...
- 堆的python实现及其应用
堆的概念 优先队列(priority queue)是一种特殊的队列,取出元素的顺序是按照元素的优先权(关键字)大小,而不是进入队列的顺序,堆就是一种优先队列的实现.堆一般是由数组实现的,逻辑上堆可以被 ...
- Flink应用程序结构开发介绍
Flink程序遵循一定的编程模式.DataStream API 和 DataSet API 基本具有相同的程序结构.以下为一个流式程序的示例代码来对文本文件进行词频统计. package com.re ...
- PHP命令空间namespace及use的用法
使用namespace的目的 命名空间将代码划分出不同的空间(区域),每个空间的常量.函数.类(为了偷懒,我下边都将它们称为元素)的名字互不影响, 这个有点类似我们常常提到的'封装'的概念. 团队合作 ...
- U盘中病毒无法更改U盘隐藏属性,文件变成快捷方式
问题:U盘中病毒了文件都变成快捷方式了,文件被隐藏:隐藏属性无法修改 解决方法: 1.首先给U盘杀毒[如360杀毒] 2.修改U盘隐藏属性:如下图 经过此步骤被隐藏的文件可以被显示出来了.但是U盘里的 ...
- js-Date()对象,get/setFullYear(),getDay()编程练习
啥也不说!看代码 主要注意:getday()方法中原理!!! <!DOCTYPE html> <html lang="en"> <head> & ...
- luogu P1650 田忌赛马 |贪心
题目描述 我国历史上有个著名的故事: 那是在2300年以前.齐国的大将军田忌喜欢赛马.他经常和齐王赛马.他和齐王都有三匹马:常规马,上级马,超级马.一共赛三局,每局的胜者可以从负者这里取得200银币. ...
- Android多图选择
多图选择是Android中一个常用的功能,用户可以拍照或者批量选择图片上传,还是国际惯例,先看下效果图,demo地址我会放到文章末尾. 经过对比,这里我选择了一个第三方开源库PictureSelect ...
- MyBatis—resultMap 的关联方式实现多表查询(多 对一)
mapper 层 a)在 StudentMapper.xml 中定义多表连接查询 SQL 语句, 一次性查到需要的所有数据, 包括对应班级的信息. b)通过<resultMap>定义映射关 ...