namespace MIS.User_Mapping.Wcf.Shared
{
public class BaseDBAction<TID> where TID:struct
{
private BaseDBContext dbContext = null;
public BaseDBAction(BaseDBContext dbContext)
{
this.dbContext = dbContext;
}
#region Query
/// <summary>
/// get IQueryable obj
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="predicate"></param>
/// <returns></returns>
private IQueryable<TEntity> GetQueryable<TEntity>(Expression<Func<TEntity, bool>> predicate = null) where TEntity : BaseEntity<TID>
{
dbContext.Connect();
IQueryable<TEntity> querable = dbContext.Set<TEntity>();
if (predicate != null) {
querable= querable.Where<TEntity>(predicate);
}
dbContext.Disconnect();
return querable;
}
/// <summary>
/// check data contain
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="predicate"></param>
/// <returns></returns>
public bool Any<TEntity>(Expression<Func<TEntity, bool>> predicate = null) where TEntity : BaseEntity<TID>
{
return GetQueryable<TEntity>().Any(predicate);
}
/// <summary>
/// Get All
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <returns></returns>
public TEntity[] GetAll<TEntity>() where TEntity : BaseEntity<TID>
{
return GetQueryable<TEntity>().ToArray();
}
/// <summary>
/// Get by sql
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <returns></returns>
public TEntity[] GetSqlQuery<TEntity>(string sql) where TEntity : BaseEntity<TID>
{
return dbContext.Database.SqlQuery<TEntity>(sql).ToArray();
}
/// <summary>
/// get Count
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="predicate"></param>
/// <returns></returns>
public int Count<TEntity>(Expression<Func<TEntity, bool>> predicate = null) where TEntity : BaseEntity<TID>
{
return GetQueryable<TEntity>(predicate).Count();
}
/// <summary>
/// Get First obj
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="id"></param>
/// <returns></returns>
public TEntity First<TEntity>(TID id) where TEntity : BaseEntity<TID>
{
return First<TEntity>(p => (object)p.ID == (object)id);
}
/// <summary>
/// Get First obj
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="predicate"></param>
/// <returns></returns>
public TEntity First<TEntity>(Expression<Func<TEntity, bool>> predicate = null) where TEntity : BaseEntity<TID>
{
return GetQueryable<TEntity>(predicate).FirstOrDefault();
}
/// <summary>
/// Get Where obj
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="predicate"></param>
/// <returns></returns>
public TEntity[] Where<TEntity>(Expression<Func<TEntity, bool>> predicate = null,
Expression<Func<TEntity, object>> keySelector = null) where TEntity : BaseEntity<TID>
{
return GetQueryable<TEntity>(predicate).ToArray();
}
#endregion
#region DML
public void Add<TEntity>(params TEntity[] entities) where TEntity : BaseEntity<TID>
{
foreach (var entity in entities) {
dbContext.Set<TEntity>().Add(entity);
}
}
public void Update<TEntity>(params TEntity[] entities) where TEntity : BaseEntity<TID>
{
foreach (var entity in entities) {
dbContext.Entry(entity).State = EntityState.Modified;
}
}
public void Delete<TEntity>(params TEntity[] entities) where TEntity : BaseEntity<TID>
{
foreach (var entity in entities) {
dbContext.Entry(entity).State = EntityState.Deleted;
}
}
#endregion
#region Tran
public void Tran(Action action, IsolationLevel isolationLevel = IsolationLevel.ReadCommitted)
{
try {
this.dbContext.BeginTran(isolationLevel);
action();
this.dbContext.CommitTran();
}
catch{
this.dbContext.RollBackTran();
throw;
}
}
#endregion
}
}