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
}
}