public virtual DataServiceProcessingResult <List <TEntity> > Add(List <TEntity> entityToAdd)
        {
            var result = new DataServiceProcessingResult <List <TEntity> >()
            {
                Success = false, Data = null
            };

            try
            {
                foreach (var entity in entityToAdd)
                {
                    _context.Add(entity);
                }
                _context.SaveChanges();
            }
            catch (Exception e)
            {
                var errorMessage = string.Format("Could not add entities into the database.Exception Details:{0}", e.Message);
                result.Error = new ProcessingError("1", "", null, adminMessage: errorMessage);
                return(result);
            }
            result.Success = true;
            result.Data    = entityToAdd;
            return(result);
        }
        public virtual DataServiceProcessingResult <List <TEntity> > Get(Expression <Func <TEntity, bool> > predicate, int pageSize, int pageNumber, params string[] includes)
        {
            var entities = new List <TEntity>();
            var result   = new DataServiceProcessingResult <List <TEntity> >()
            {
                Success = false, Data = null
            };

            try
            {
                entities = DbSet.IncludeMany(includes).Where(predicate).Skip((pageNumber) * pageSize).Take(pageSize).ToList();
                if (entities == null)
                {
                    return(result);
                }
                _context.SaveChanges();
            }
            catch (Exception e)
            {
                var errorMessage = string.Format("Could not get the entities from database.");
                result.Error = new ProcessingError("1", "", null, adminMessage: errorMessage);
                return(result);
            }
            result.Data    = entities;
            result.Success = true;
            return(result);
        }
        public virtual DataServiceProcessingResult <List <T2> > Get <T2>(Expression <Func <TEntity, bool> > wherePredicate, Expression <Func <TEntity, T2> > selectPredicate, params string[] includes)
        {
            var entities = new List <T2>();
            var result   = new DataServiceProcessingResult <List <T2> >()
            {
                Success = false, Data = null
            };

            try
            {
                entities = DbSet.IncludeMany(includes).Where(wherePredicate).Select(selectPredicate).ToList();
                if (entities == null)
                {
                    return(result);
                }
                _context.SaveChanges();
            }
            catch (Exception e)
            {
                var errorMessage = string.Format("Could not fetch the entities from database.Exception Details:{0}", e.Message);
                result.Error = new ProcessingError("1", "", null, adminMessage: errorMessage);
                return(result);
            }
            result.Success = true;
            result.Data    = entities;
            return(result);
        }
        public virtual DataServiceProcessingResult <TEntity> Delete(string id)
        {
            var result = new DataServiceProcessingResult <TEntity>()
            {
                Success = false, Data = null
            };
            var existingEntityResult = this.Get(id);

            if (!existingEntityResult.Success)
            {
                return(result);
            }
            try
            {
                _context.Remove <TEntity>(existingEntityResult.Data);
                _context.SaveChanges();
            }
            catch (Exception e)
            {
                var errorDescription = string.Format("Could not remove the entity from database.Exception Details:{0}", e.Message);
                result.Error = new ProcessingError("1", "", null, adminMessage: errorDescription);
                return(result);
            }
            result.Success = true;
            return(result);
        }
        public virtual DataServiceProcessingResult <TEntity> Get(TEntity entityToFind)
        {
            TEntity entity;
            var     result = new DataServiceProcessingResult <TEntity>()
            {
                Success = false, Data = null
            };

            try
            {
                entity = _context.Find <TEntity>(entityToFind);
                if (entity == null)
                {
                    return(result);
                }
                _context.SaveChanges();
            }
            catch (Exception e)
            {
                var errorMessage = string.Format("Could not fetch the entities into database.Exception Details:{0}", e.Message);
                result.Error = new ProcessingError("1", "", null, adminMessage: errorMessage);
                return(result);
            }
            result.Data    = entity;
            result.Success = true;
            return(result);
        }
        public virtual DataServiceProcessingResult <List <TEntity> > Get(Expression <Func <TEntity, bool> > predicate, int pageSize, int pageNumber, string sortingColumn, string sortingDirection, params string[] includes)
        {
            var entities = new List <TEntity>();
            var result   = new DataServiceProcessingResult <List <TEntity> >()
            {
                Success = false, Data = null
            };

            try
            {
                var queryPredicate = DbSet.IncludeMany(includes).Where(predicate);

                PropertyInfo property = !string.IsNullOrEmpty(sortingColumn) ? typeof(TEntity).GetProperty(sortingColumn, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase) : null;
                if (string.IsNullOrEmpty(sortingDirection) && property != null)
                {
                    if (sortingDirection == "asc")
                    {
                        queryPredicate = queryPredicate.OrderBy(o => property.GetValue(o, null));
                    }
                    else if (sortingDirection == "desc")
                    {
                        queryPredicate = queryPredicate.OrderByDescending(o => property.GetValue(o, null));
                    }
                }
                entities = queryPredicate.Skip((pageNumber) * pageSize).Take(pageSize).ToList();
                if (entities == null)
                {
                    return(result);
                }
                _context.SaveChanges();
            }
            catch (Exception e)
            {
                var errorDescription = string.Format("Could not fetch the entities from database.Exception Details:{0}", e.Message);
                result.Error = new ProcessingError("1", "", null, adminMessage: errorDescription);
                return(result);
            }
            result.Data    = entities;
            result.Success = true;
            return(result);
        }
        public virtual DataServiceProcessingResult <List <TEntity> > Get()
        {
            var result = new DataServiceProcessingResult <List <TEntity> >()
            {
                Success = false, Data = null
            };

            try
            {
                _context.SaveChanges();
            }
            catch (Exception e)
            {
                var errorMessage = string.Format("Could not update the Entities into database.Exception Details:{0}", e.Message);
                result.Error = new ProcessingError("1", "", null, adminMessage: errorMessage);
                return(result);
            }
            result.Data    = DbSet.ToList();
            result.Success = true;
            return(result);
        }
        public virtual DataServiceProcessingResult <List <TEntity> > Delete(List <TEntity> entitiesToDelete)
        {
            var result = new DataServiceProcessingResult <List <TEntity> >()
            {
                Success = false, Data = null
            };
            var markedToDelete = new List <TEntity>();
            var failedToDelete = new List <TEntity>();

            foreach (var entity in entitiesToDelete)
            {
                var existingEntityResult = this.Get(entity);
                if (!existingEntityResult.Success)
                {
                    failedToDelete.Add(entity);
                }
                markedToDelete.Add(entity);
            }
            if (failedToDelete.Count > 0)
            {
                result.Success = false;
                result.Data    = failedToDelete;
                return(result);
            }
            try
            {
                _context.RemoveRange(markedToDelete);
                _context.SaveChanges();
            }
            catch (Exception e)
            {
                var errorMessage = string.Format("Could not remove the entities from database.Exception Details:{0}", e.Message);
                result.Error = new ProcessingError("1", "", null, adminMessage: errorMessage);
                return(result);
            }
            result.Success = true;
            result.Data    = markedToDelete;
            return(result);
        }
        public virtual DataServiceProcessingResult <List <TEntity> > Update(List <TEntity> entitiesToUpdate)
        {
            var result = new DataServiceProcessingResult <List <TEntity> >()
            {
                Success = false, Data = null
            };

            try
            {
                _context.UpdateRange(entitiesToUpdate);
                _context.SaveChanges();
            }
            catch (Exception e)
            {
                var errorDescription = string.Format("Could not update the entities into database.Exceotion Details:{0}", e.Message);
                result.Error = new ProcessingError("1", "", null, adminMessage: errorDescription);
                return(result);
            }
            result.Success = true;
            result.Data    = entitiesToUpdate;
            return(result);
        }
        public virtual DataServiceProcessingResult <TEntity> Add(TEntity entityToAdd)
        {
            var result = new DataServiceProcessingResult <TEntity>()
            {
                Success = false, Data = null
            };

            try
            {
                _context.Add(entityToAdd);
                _context.SaveChanges();
            }
            catch (Exception e)
            {
                var errorDescription = string.Format("Could not add the entity into database.Exception Details:{0}", e.Message);
                result.Error = new ProcessingError("1", "", null, adminMessage: errorDescription);
                return(result);
            }
            result.Success = true;
            result.Data    = entityToAdd;
            return(result);
        }
        public virtual DataServiceProcessingResult <int> GetCount(Expression <Func <TEntity, bool> > predicate)
        {
            int count  = 0;
            var result = new DataServiceProcessingResult <int>()
            {
                Success = false
            };

            try
            {
                count = DbSet.Where(predicate).ToList().Count;
                _context.SaveChanges();
            }
            catch (Exception e)
            {
                var errorMessage = string.Format("Could not fetch the count from the database.Exception Details:{0}", e.Message);
                result.Error = new ProcessingError("1", "", null, adminMessage: errorMessage);
                return(result);
            }
            result.Data    = count;
            result.Success = true;
            return(result);
        }