【.Net Core从零开始前后端分离】(六)——泛型基类异步编程

前言

这一章节学习一下泛型基类的搭建以及异步编程

构建各分层的基类

1、在Blog.Core.IRepository 层中添加BASE文件夹,并添加接口 IBaseRepository.cs

public interface IBaseRepository where TEntity : class
{

Task QueryByID(object objId);
Task QueryByID(object objId, bool blnUseCache = false);
Task<List> QueryByIDs(object[] lstIds);

Task Add(TEntity model);

Task DeleteById(object id);

Task Delete(TEntity model);

Task DeleteByIds(object[] ids);

Task Update(TEntity model);
Task Update(TEntity entity, string strWhere);
Task Update(TEntity entity, List lstColumns = null, List lstIgnoreColumns = null, string strWhere = "");

Task<List> Query();
Task<List> Query(string strWhere);
Task<List> Query(Expression<Func<TEntity, bool>> whereExpression);
Task<List> Query(Expression<Func<TEntity, bool>> whereExpression, string strOrderByFileds);
Task<List> Query(Expression<Func<TEntity, bool>> whereExpression, Expression<Func<TEntity, object>> orderByExpression, bool isAsc = true);
Task<List> Query(string strWhere, string strOrderByFileds);
Task<List> Query(Expression<Func<TEntity, bool>> whereExpression, int intTop, string strOrderByFileds);
Task<List> Query(string strWhere, int intTop, string strOrderByFileds);
Task<List> Query(
Expression<Func<TEntity, bool>> whereExpression, int intPageIndex, int intPageSize, string strOrderByFileds);
Task<List> Query(string strWhere, int intPageIndex, int intPageSize, string strOrderByFileds);
Task<List> QueryPage(Expression<Func<TEntity, bool>> whereExpression, int intPageIndex = 0, int intPageSize = 20, string strOrderByFileds =
null);
}

2、IAdvertisementRepository 继承Base基类

public interface IAdvertisementRepository:IBaseRepository
{
int Sum(int i, int j);

//int Add(Advertisement model);
//bool Delete(Advertisement model);
//bool Update(Advertisement model);
//List Query(Expression<Func<Advertisement, bool>> whereExpression);
}

3、在Blog.Core.Repository 层中添加BASE文件夹,并添加接口 Repository.cs

public class BaseRepository : IBaseRepository where TEntity : class, new()
{
private DbContext context;
private SqlSugarClient db;
private SimpleClient entityDB;

public DbContext Context
{
get { return context; }
set { context = value; }
}
internal SqlSugarClient Db
{
get { return db; }
private set { db = value; }
}
internal SimpleClient EntityDB
{
get { return entityDB; }
private set { entityDB = value; }
}
public BaseRepository()
{
DbContext.Init(BaseDBConfig.ConnectionString);
DbContext.DbType = DbType.MySql;
context = DbContext.GetDbContext();
db = context.Db;
entityDB = context.GetEntityDB(db);
}

public async Task QueryByID(object objId)
{
return await Task.Run(() => db.Queryable().InSingle(objId));
}
///


/// 功能描述:根据ID查询一条数据
/// 作  者:Blog.Core
///

/// id(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件
/// 是否使用缓存
/// 数据实体
public async Task QueryByID(object objId, bool blnUseCache = false)
{
return await Task.Run(() => db.Queryable().WithCacheIF(blnUseCache).InSingle(objId));
}

///


/// 功能描述:根据ID查询数据
/// 作  者:Blog.Core
///

/// id列表(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件
/// 数据实体列表
public async Task<List> QueryByIDs(object[] lstIds)
{
return await Task.Run(() => db.Queryable().In(lstIds).ToList());
}

///


/// 写入实体数据
///

/// 博文实体类
///
public async Task Add(TEntity entity)
{
var i = await Task.Run(() => db.Insertable(entity).ExecuteReturnBigIdentity());
//返回的i是long类型,这里你可以根据你的业务需要进行处理
return (int)i;
}

///


/// 更新实体数据
///

/// 博文实体类
///
public async Task Update(TEntity entity)
{
//这种方式会以主键为条件
var i = await Task.Run(() => db.Updateable(entity).ExecuteCommand());
return i > 0;
}

public async Task Update(TEntity entity, string strWhere)
{
return await Task.Run(() => db.Updateable(entity).Where(strWhere).ExecuteCommand() > 0);
}

public async Task Update(string strSql, SugarParameter[] parameters = null)
{
return await Task.Run(() => db.Ado.ExecuteCommand(strSql, parameters) > 0);
}

public async Task Update(
TEntity entity,
List lstColumns = null,
List lstIgnoreColumns = null,
string strWhere = ""
)
{
IUpdateable up = await Task.Run(() => db.Updateable(entity));
if (lstIgnoreColumns != null && lstIgnoreColumns.Count > 0)
{
up = await Task.Run(() => up.IgnoreColumns(it => lstIgnoreColumns.Contains(it)));
}
if (lstColumns != null && lstColumns.Count > 0)
{
up = await Task.Run(() => up.UpdateColumns(it => lstColumns.Contains(it)));
}
if (!string.IsNullOrEmpty(strWhere))
{
up = await Task.Run(() => up.Where(strWhere));
}
return await Task.Run(() => up.ExecuteCommand()) > 0;
}

///


/// 根据实体删除一条数据
///

/// 博文实体类
///
public async Task Delete(TEntity entity)
{
var i = await Task.Run(() => db.Deleteable(entity).ExecuteCommand());
return i > 0;
}

///


/// 删除指定ID的数据
///

/// 主键ID
///
public async Task DeleteById(object id)
{
var i = await Task.Run(() => db.Deleteable(id).ExecuteCommand());
return i > 0;
}

///


/// 删除指定ID集合的数据(批量删除)
///

/// 主键ID集合
///
public async Task DeleteByIds(object[] ids)
{
var i = await Task.Run(() => db.Deleteable().In(ids).ExecuteCommand());
return i > 0;
}

///


/// 功能描述:查询所有数据
/// 作  者:Blog.Core
///

/// 数据列表
public async Task<List> Query()
{
return await Task.Run(() => entityDB.GetList());
}

///


/// 功能描述:查询数据列表
/// 作  者:Blog.Core
///

/// 条件
/// 数据列表
public async Task<List> Query(string strWhere)
{
return await Task.Run(() => db.Queryable().WhereIF(!string.IsNullOrEmpty(strWhere), strWhere).ToList());
}

///


/// 功能描述:查询数据列表
/// 作  者:Blog.Core
///

/// whereExpression
/// 数据列表
public async Task<List> Query(Expression<Func<TEntity, bool>> whereExpression)
{
return await Task.Run(() => entityDB.GetList(whereExpression));
}

///


/// 功能描述:查询一个列表
/// 作  者:Blog.Core
///

/// 条件表达式
/// 排序字段,如name asc,age desc
/// 数据列表
public async Task<List> Query(Expression<Func<TEntity, bool>> whereExpression, string strOrderByFileds)
{
return await Task.Run(() => db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(whereExpression != null, whereExpression).ToList());
}
///
/// 功能描述:查询一个列表
///

///
///
///
///
public async Task<List> Query(Expression<Func<TEntity, bool>> whereExpression, Expression<Func<TEntity, object>> orderByExpression, bool isAsc = true)
{
return await Task.Run(() => db.Queryable().OrderByIF(orderByExpression != null, orderByExpression, isAsc ? OrderByType.Asc : OrderByType.Desc).WhereIF(whereExpression != null, whereExpression).ToList());
}

///


/// 功能描述:查询一个列表
/// 作  者:Blog.Core
///

/// 条件
/// 排序字段,如name asc,age desc
/// 数据列表
public async Task<List> Query(string strWhere, string strOrderByFileds)
{
return await Task.Run(() => db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(!string.IsNullOrEmpty(strWhere), strWhere).ToList());
}

///


/// 功能描述:查询前N条数据
/// 作  者:Blog.Core
///

/// 条件表达式
/// 前N条
/// 排序字段,如name asc,age desc
/// 数据列表
public async Task<List> Query(
Expression<Func<TEntity, bool>> whereExpression,
int intTop,
string strOrderByFileds)
{
return await Task.Run(() => db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(whereExpression != null, whereExpression).Take(intTop).ToList());
}

///


/// 功能描述:查询前N条数据
/// 作  者:Blog.Core
///

/// 条件
/// 前N条
/// 排序字段,如name asc,age desc
/// 数据列表
public async Task<List> Query(
string strWhere,
int intTop,
string strOrderByFileds)
{
return await Task.Run(() => db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(!string.IsNullOrEmpty(strWhere), strWhere).Take(intTop).ToList());
}

///


/// 功能描述:分页查询
/// 作  者:Blog.Core
///

/// 条件表达式
/// 页码(下标0)
/// 页大小
/// 数据总量
/// 排序字段,如name asc,age desc
/// 数据列表
public async Task<List> Query(
Expression<Func<TEntity, bool>> whereExpression,
int intPageIndex,
int intPageSize,
string strOrderByFileds)
{
return await Task.Run(() => db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(whereExpression != null, whereExpression).ToPageList(intPageIndex, intPageSize));
}

///


/// 功能描述:分页查询
/// 作  者:Blog.Core
///

/// 条件
/// 页码(下标0)
/// 页大小
/// 数据总量
/// 排序字段,如name asc,age desc
/// 数据列表
public async Task<List> Query(
string strWhere,
int intPageIndex,
int intPageSize,
string strOrderByFileds)
{
return await Task.Run(() => db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(!string.IsNullOrEmpty(strWhere), strWhere).ToPageList(intPageIndex, intPageSize));
}

public async Task<List> QueryPage(Expression<Func<TEntity, bool>> whereExpression,
int intPageIndex = 0, int intPageSize = 20, string strOrderByFileds = null)
{
return await Task.Run(() => db.Queryable()
.OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds)
.WhereIF(whereExpression != null, whereExpression)
.ToPageList(intPageIndex, intPageSize));
}
}

4、AdvertisementRepository 继承Base基类

public class AdvertisementRepository : BaseRepository,IAdvertisementRepository
{
//private DbContext context;
//private SqlSugarClient db;
//private SimpleClient entityDB;

//internal SqlSugarClient Db
//{
// get { return db; }
// private set { db = value; }
//}
//public DbContext Context
//{
// get { return context; }
// set { context = value; }
//}
//public AdvertisementRepository()
//{
// DbContext.Init(BaseDBConfig.ConnectionString);
// DbContext.DbType = DbType.MySql;
// context = DbContext.GetDbContext();
// db = context.Db;
// entityDB = context.GetEntityDB(db);
//}
//public int Add(Advertisement model)
//{
// //返回的i是long类型,这里你可以根据你的业务需要进行处理
// var i = db.Insertable(model).ExecuteReturnBigIdentity();
// return i.ObjToInt();
//}

//public bool Delete(Advertisement model)
//{
// var i = db.Deleteable(model).ExecuteCommand();
// return i > 0;
//}

//public List Query(Expression<Func<Advertisement, bool>> whereExpression)
//{
// return entityDB.GetList(whereExpression);

//}

public int Sum(int i, int j)
{
return i + j;
}

//public bool Update(Advertisement model)
//{
// //这种方式会以主键为条件
// var i = db.Updateable(model).ExecuteCommand();
// return i > 0;
//}
}

5、在Blog.Core.IService 层中添加BASE文件夹,并添加接口 IBaseService.cs

public interface IBaseServices where TEntity : class
{

Task QueryByID(object objId);
Task QueryByID(object objId, bool blnUseCache = false);
Task<List> QueryByIDs(object[] lstIds);

Task Add(TEntity model);

Task DeleteById(object id);

Task Delete(TEntity model);

Task DeleteByIds(object[] ids);

Task Update(TEntity model);
Task Update(TEntity entity, string strWhere);

Task Update(TEntity entity, List lstColumns = null, List lstIgnoreColumns = null, string strWhere = "");

Task<List> Query();
Task<List> Query(string strWhere);
Task<List> Query(Expression<Func<TEntity, bool>> whereExpression);
Task<List> Query(Expression<Func<TEntity, bool>> whereExpression, string strOrderByFileds);
Task<List> Query(Expression<Func<TEntity, bool>> whereExpression, Expression<Func<TEntity, object>> orderByExpression, bool isAsc = true);
Task<List> Query(string strWhere, string strOrderByFileds);

Task<List> Query(Expression<Func<TEntity, bool>> whereExpression, int intTop, string strOrderByFileds);
Task<List> Query(string strWhere, int intTop, string strOrderByFileds);

Task<List> Query(
Expression<Func<TEntity, bool>> whereExpression, int intPageIndex, int intPageSize, string strOrderByFileds);
Task<List> Query(string strWhere, int intPageIndex, int intPageSize, string strOrderByFileds);

Task<List> QueryPage(Expression<Func<TEntity, bool>> whereExpression, int intPageIndex = 0, int intPageSize = 20, string strOrderByFileds = null);
}

6、IAdvertisementServices 继承Base基类

public interface IAdvertisementServices: IBaseServices
{
int Sum(int i, int j);
//int Add(Advertisement model);
//bool Delete(Advertisement model);
//bool Update(Advertisement model);
//List Query(Expression<Func<Advertisement, bool>> whereExpression);
}

7、在Blog.Core.Service 层中添加BASE文件夹,并添加接口 BaseServices.cs

public class BaseServices : IBaseServices where TEntity : class, new()
{
public IBaseRepository baseDal = new BaseRepository();

public async Task QueryByID(object objId)
{
return await baseDal.QueryByID(objId);
}
///


/// 功能描述:根据ID查询一条数据
/// 作  者:AZLinli.Blog.Core
///

/// id(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件
/// 是否使用缓存
/// 数据实体
public async Task QueryByID(object objId, bool blnUseCache = false)
{
return await baseDal.QueryByID(objId, blnUseCache);
}

///


/// 功能描述:根据ID查询数据
/// 作  者:AZLinli.Blog.Core
///

/// id列表(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件
/// 数据实体列表
public async Task<List> QueryByIDs(object[] lstIds)
{
return await baseDal.QueryByIDs(lstIds);
}

///


/// 写入实体数据
///

/// 博文实体类
///
public async Task Add(TEntity entity)
{
return await baseDal.Add(entity);
}

///


/// 更新实体数据
///

/// 博文实体类
///
public async Task Update(TEntity entity)
{
return await baseDal.Update(entity);
}
public async Task Update(TEntity entity, string strWhere)
{
return await baseDal.Update(entity, strWhere);
}

public async Task Update(
TEntity entity,
List lstColumns = null,
List lstIgnoreColumns = null,
string strWhere = ""
)
{
return await baseDal.Update(entity, lstColumns, lstIgnoreColumns, strWhere);
}

///


/// 根据实体删除一条数据
///

/// 博文实体类
///
public async Task Delete(TEntity entity)
{
return await baseDal.Delete(entity);
}

///


/// 删除指定ID的数据
///

/// 主键ID
///
public async Task DeleteById(object id)
{
return await baseDal.DeleteById(id);
}

///


/// 删除指定ID集合的数据(批量删除)
///

/// 主键ID集合
///
public async Task DeleteByIds(object[] ids)
{
return await baseDal.DeleteByIds(ids);
}

///


/// 功能描述:查询所有数据
/// 作  者:AZLinli.Blog.Core
///

/// 数据列表
public async Task<List> Query()
{
return await baseDal.Query();
}

///


/// 功能描述:查询数据列表
/// 作  者:AZLinli.Blog.Core
///

/// 条件
/// 数据列表
public async Task<List> Query(string strWhere)
{
return await baseDal.Query(strWhere);
}

///


/// 功能描述:查询数据列表
/// 作  者:AZLinli.Blog.Core
///

/// whereExpression
/// 数据列表
public async Task<List> Query(Expression<Func<TEntity, bool>> whereExpression)
{
return await baseDal.Query(whereExpression);
}
///
/// 功能描述:查询一个列表
/// 作  者:AZLinli.Blog.Core
///

/// 条件表达式
/// 排序字段,如name asc,age desc
/// 数据列表
public async Task<List> Query(Expression<Func<TEntity, bool>> whereExpression, Expression<Func<TEntity, object>> orderByExpression, bool isAsc = true)
{
return await baseDal.Query(whereExpression, orderByExpression, isAsc);
}

public async Task<List> Query(Expression<Func<TEntity, bool>> whereExpression, string strOrderByFileds)
{
return await baseDal.Query(whereExpression, strOrderByFileds);
}

///


/// 功能描述:查询一个列表
/// 作  者:AZLinli.Blog.Core
///

/// 条件
/// 排序字段,如name asc,age desc
/// 数据列表
public async Task<List> Query(string strWhere, string strOrderByFileds)
{
return await baseDal.Query(strWhere, strOrderByFileds);
}

///


/// 功能描述:查询前N条数据
/// 作  者:AZLinli.Blog.Core
///

/// 条件表达式
/// 前N条
/// 排序字段,如name asc,age desc
/// 数据列表
public async Task<List> Query(Expression<Func<TEntity, bool>> whereExpression, int intTop, string strOrderByFileds)
{
return await baseDal.Query(whereExpression, intTop, strOrderByFileds);
}

///


/// 功能描述:查询前N条数据
/// 作  者:AZLinli.Blog.Core
///

/// 条件
/// 前N条
/// 排序字段,如name asc,age desc
/// 数据列表
public async Task<List> Query(
string strWhere,
int intTop,
string strOrderByFileds)
{
return await baseDal.Query(strWhere, intTop, strOrderByFileds);
}

///


/// 功能描述:分页查询
/// 作  者:AZLinli.Blog.Core
///

/// 条件表达式
/// 页码(下标0)
/// 页大小
/// 数据总量
/// 排序字段,如name asc,age desc
/// 数据列表
public async Task<List> Query(
Expression<Func<TEntity, bool>> whereExpression,
int intPageIndex,
int intPageSize,
string strOrderByFileds)
{
return await baseDal.Query(
whereExpression,
intPageIndex,
intPageSize,
strOrderByFileds);
}

///


/// 功能描述:分页查询
/// 作  者:AZLinli.Blog.Core
///

/// 条件
/// 页码(下标0)
/// 页大小
/// 数据总量
/// 排序字段,如name asc,age desc
/// 数据列表
public async Task<List> Query(
string strWhere,
int intPageIndex,
int intPageSize,
string strOrderByFileds)
{
return await baseDal.Query(
strWhere,
intPageIndex,
intPageSize,
strOrderByFileds);
}

public async Task<List> QueryPage(Expression<Func<TEntity, bool>> whereExpression,
int intPageIndex = 0, int intPageSize = 20, string strOrderByFileds = null)
{
return await baseDal.QueryPage(whereExpression,
intPageIndex = 0, intPageSize, strOrderByFileds);
}

}

8、AdvertisementService 继承Base基类

public class AdvertisementServices : BaseServices,IAdvertisementServices
{
public IAdvertisementRepository dal = new AdvertisementRepository();
public int Sum(int i, int j)
{
return dal.Sum(i, j);

}
//public int Add(Advertisement model)
//{
// return dal.Add(model);
//}

//public bool Delete(Advertisement model)
//{
// return dal.Delete(model);
//}

//public List Query(Expression<Func<Advertisement, bool>> whereExpression)
//{
// return dal.Query(whereExpression);

//}

//public bool Update(Advertisement model)
//{
// return dal.Update(model);
//}
}

二、运行项目,并调试接口

这个时候,需要把接口改成异步请求方式:

// GET: api/Blog/5
///


/// 根据id获取数据
///

/// 参数id
///
[HttpGet("{id}", Name = "Get")]
public async Task<List> Get(int id)
{
IAdvertisementServices advertisementServices = new AdvertisementServices();

return await advertisementServices.Query(d => d.Id == id);
}

Http返回200,一切正常

结语

这一章节抽取了泛型基类,并且将请求改为异步请求。

Github

https://github.com/Nick-Hoper/Blog.Core.Demo.git

posted @ 2020-12-24 14:58  凌云幽雨  阅读(884)  评论(2)    收藏  举报