BaseDBAction

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

 

posted @ 2016-12-06 17:39  江境纣州  阅读(137)  评论(0)    收藏  举报