using InSituLaboratory.Base; using InSituLaboratory.IService; using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage; using System.Linq.Expressions; namespace InSituLaboratory.Service { public class BaseService : IBaseService { protected readonly DbContext Context; public BaseService(DbContext context) { Context = context; } #region Query /// /// Context 就是数据库操作的EFcore的上下文Context /// /// /// /// public T Find(int id) where T : class { return Context.Set().Find(id); } /// /// 不应该暴露给上端使用者,尽量少用 /// /// /// //[Obsolete("尽量避免使用,using 带表达式目录树的代替")] public IQueryable Set() where T : class { return Context.Set(); } /// /// 这才是合理的做法,上端给条件,这里查询 /// /// /// /// public IQueryable Query(Expression> funcWhere) where T : class { return Context.Set().Where(funcWhere); } /// /// 分页查询 /// /// /// /// /// /// /// /// /// public PageResult QueryPage(Expression> funcWhere, int pageSize, int pageIndex, Expression> funcOrderby, bool isAsc = true) where T : class { var list = Set(); if (funcWhere != null) { list = list.Where(funcWhere); } if (isAsc) { list = list.OrderBy(funcOrderby); } else { list = list.OrderByDescending(funcOrderby); } PageResult result = new PageResult() { DataList = list.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(), PageIndex = pageIndex, PageSize = pageSize, TotalCount = list.Count() }; return result; } #endregion #region Insert /// /// 即使保存 不需要再Commit /// /// /// /// public T Insert(T t) where T : class { Context.Set().Add(t); Commit();//写在这里 就不需要单独commit 不写就需要 return t; } public IEnumerable Insert(IEnumerable tList) where T : class { Context.Set().AddRange(tList); Commit();//一个链接 多个sql return tList; } #endregion #region Update /// /// 是没有实现查询,直接更新的,需要Attach和State /// /// 如果是已经在context,只能再封装一个(在具体的service) /// /// /// public void Update(T t) where T : class { if (t == null) throw new Exception("t is null"); Context.Set().Attach(t);//将数据附加到上下文,支持实体修改和新实体,重置为UnChanged Context.Entry(t).State = EntityState.Modified; Commit();//保存 然后重置为UnChanged } public void Update(IEnumerable tList) where T : class { foreach (var t in tList) { Context.Set().Attach(t); Context.Entry(t).State = EntityState.Modified; } Commit(); } #endregion #region Delete /// /// 先附加 再删除 /// /// /// public void Delete(T t) where T : class { if (t == null) throw new Exception("t is null"); Context.Set().Attach(t); Context.Set().Remove(t); Commit(); } /// /// 还可以增加非即时commit版本的, /// 做成protected /// /// /// public void Delete(int Id) where T : class { T t = Find(Id);//也可以附加 if (t == null) throw new Exception("t is null"); Context.Set().Remove(t); Commit(); } public void Delete(IEnumerable tList) where T : class { foreach (var t in tList) { Context.Set().Attach(t); } Context.Set().RemoveRange(tList); Commit(); } #endregion #region Other /// /// 本省就是一个事务,前面可以多个操作,这里的SaveChange 就是把多个操作统一提交 /// public void Commit() { Context.SaveChanges(); } public IQueryable ExcuteQuery(string sql, SqlParameter[] parameters) where T : class { return null; } public void Excute(string sql, SqlParameter[] parameters) where T : class { IDbContextTransaction trans = null; //DbContextTransaction trans = null; try { trans = Context.Database.BeginTransaction(); //这里是启动一个事务 //this.Context.Database.ExecuteSqlRaw(sql, parameters); trans.Commit(); } catch (Exception) { if (trans != null) trans.Rollback(); throw; } } public virtual void Dispose() { if (Context != null) { Context.Dispose(); } } #endregion } }