using Permission.Infrastructure.Core;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using System.Reflection;
using Permission.Infrastructure.WebControls;
using Permission.Entity.DbContext;
using Permission.Infrastructure.Repositories;
namespace Permission.Data.Repositories
{
///
/// 仓储数据访问基接口实现
///
///
public class BaseRepository : IBaseRepository where T : BaseEntity
{
#region 数据上下文
///
/// 数据上下文
///
private readonly PermissionContext _context;
///
/// 工作单元
///
private IUnitOfWork _unitOfWork;
public IQueryable Entities => _context.Set();
public BaseRepository(PermissionContext context, IUnitOfWork unitOfWork)
{
_context = context;
_unitOfWork = unitOfWork;
}
#endregion
#region 单模型 CRUD 操作
public virtual bool Save(T entity, bool isCommit = true)
{
_context.Add(entity);
if (isCommit)
{
return _unitOfWork.SaveChanges() > 0;
}
else
{
return false;
}
}
public virtual async Task SaveAsync(T entity, bool isCommit = true)
{
_context.Set().Add(entity);
if (isCommit)
{
return await Task.Run(() => _unitOfWork.SaveChanges() > 0);
}
else
{
return await Task.Run(() => false);
}
}
public virtual bool Update(T entity, bool isCommit = true)
{
if (_context.Entry(entity).State == EntityState.Detached)
{
_context.Set().Attach(entity);
_context.Entry(entity).State = EntityState.Modified;
}
else
{
_context.Entry(entity).State = EntityState.Modified;
}
if (isCommit)
{
return _unitOfWork.SaveChanges() > 0;
}
else
{
return false;
}
}
public virtual async Task UpdateAsync(T entity, bool isCommit = true)
{
//_context.Set().Attach(entity);
//_context.Entry(entity).State = EntityState.Modified;
if (_context.Entry(entity).State == EntityState.Detached)
{
_context.Set().Attach(entity);
_context.Entry(entity).State = EntityState.Modified;
}
else
{
_context.Entry(entity).State = EntityState.Modified;
}
if (isCommit)
{
return await Task.Run(() => _unitOfWork.SaveChanges() > 0);
}
else
{
return await Task.Run(() => false);
}
}
public virtual bool SaveOrUpdate(T entity, bool isSave, bool isCommit = true)
{
return isSave ? Save(entity, isCommit) : Update(entity, isCommit);
}
public virtual async Task SaveOrUpdateAsync(T entity, bool isSave, bool isCommit = true)
{
return isSave ? await SaveAsync(entity, isCommit) : await UpdateAsync(entity, isCommit);
}
public virtual T Get(Expression> predicate)
{
//return _context.Set().AsNoTracking().SingleOrDefault(predicate);
return _context.Set().SingleOrDefault(predicate);
}
public virtual T Get(object key)
{
return _context.Set().Find(key);
}
public virtual async Task GetAsync(object key)
{
return await Task.Run(() => _context.Set().Find(key));
}
public virtual async Task GetAsync(Expression> predicate)
{
return await Task.Run(() => _context.Set().SingleOrDefault(predicate));
}
public virtual bool Delete(T entity, bool isCommit = true)
{
if (entity == null)
{
return false;
}
_context.Set().Attach(entity);
_context.Set().Remove(entity);
if (isCommit)
{
return _unitOfWork.SaveChanges() > 0;
}
else
{
return false;
}
}
public virtual async Task DeleteAsync(T entity, bool isCommit = true)
{
if (entity == null)
{
return await Task.Run(() => false);
}
_context.Set().Attach(entity);
_context.Set().Remove(entity);
if (isCommit)
{
return await Task.Run(() => _unitOfWork.SaveChanges() > 0);
}
else
{
return await Task.Run(() => false);
}
}
#endregion
#region 多模型 操作
public virtual bool SaveList(List entities, bool isCommit = true)
{
if (entities == null || !entities.Any())
{
return false;
}
entities.ToList().ForEach(item =>
{
_context.Set().Add(item);
});
if (isCommit)
{
return _unitOfWork.SaveChanges() > 0;
}
else
{
return false;
}
}
public virtual async Task SaveListAsync(List entities, bool isCommit = true)
{
if (entities == null || !entities.Any())
{
return await Task.Run(() => false);
}
entities.ToList().ForEach(item =>
{
_context.Set().Add(item);
});
if (isCommit)
{
return await Task.Run(() => _unitOfWork.SaveChanges() > 0);
}
else
{
return await Task.Run(() => false);
}
}
public virtual bool SaveList(List entities, bool isCommit = true) where TEntity : class
{
if (entities == null || !entities.Any())
{
return false;
}
var tmp = _context.ChangeTracker.Entries().ToList();
foreach (var x in tmp)
{
var properties = typeof(T).GetTypeInfo().GetProperties();
foreach (var y in properties)
{
var entry = x.Property(y.Name);
entry.CurrentValue = entry.OriginalValue;
entry.IsModified = false;
y.SetValue(x.Entity, entry.OriginalValue);
}
x.State = EntityState.Unchanged;
}
entities.ToList().ForEach(item =>
{
_context.Set().Add(item);
});
if (isCommit)
{
return _unitOfWork.SaveChanges() > 0;
}
else
{
return false;
}
}
public virtual async Task SaveListAsync(List entities, bool isCommit = true) where TEntity : class
{
if (entities == null || !entities.Any())
{
return await Task.Run(() => false);
}
var tmp = _context.ChangeTracker.Entries().ToList();
foreach (var x in tmp)
{
var properties = typeof(T).GetTypeInfo().GetProperties();
foreach (var y in properties)
{
var entry = x.Property(y.Name);
entry.CurrentValue = entry.OriginalValue;
entry.IsModified = false;
y.SetValue(x.Entity, entry.OriginalValue);
}
x.State = EntityState.Unchanged;
}
entities.ToList().ForEach(item =>
{
_context.Set().Add(item);
});
if (isCommit)
{
return await Task.Run(() => _unitOfWork.SaveChanges() > 0);
}
else
{
return await Task.Run(() => false);
}
}
public virtual bool UpdateList(List entities, bool isCommit = true)
{
if (entities == null || !entities.Any())
{
return false;
}
entities.ToList().ForEach(item =>
{
_context.Set().Attach(item);
_context.Entry(item).State = EntityState.Modified;
});
if (isCommit)
{
return _unitOfWork.SaveChanges() > 0;
}
else
{
return false;
}
}
public virtual async Task UpdateListAsync(List entities, bool isCommit = true)
{
if (entities == null || !entities.Any())
{
return await Task.Run(() => false);
}
entities.ToList().ForEach(item =>
{
_context.Set().Attach(item);
_context.Entry(item).State = EntityState.Modified;
});
if (isCommit)
{
return await Task.Run(() => _unitOfWork.SaveChanges() > 0);
}
else
{
return await Task.Run(() => false);
}
}
public virtual bool UpdateList(List entities, bool isCommit = true) where TEntity : class
{
if (entities == null || !entities.Any())
{
return false;
}
entities.ToList().ForEach(item =>
{
_context.Set().Attach(item);
_context.Entry(item).State = EntityState.Modified;
});
if (isCommit)
{
return _unitOfWork.SaveChanges() > 0;
}
else
{
return false;
}
}
public virtual async Task UpdateListAsync(List entities, bool isCommit = true) where TEntity : class
{
if (entities == null || !entities.Any())
{
return await Task.Run(() => false);
}
entities.ToList().ForEach(item =>
{
_context.Set().Attach(item);
_context.Entry(item).State = EntityState.Modified;
});
if (isCommit)
{
return await Task.Run(() => _unitOfWork.SaveChanges() > 0);
}
else
{
return await Task.Run(() => false);
}
}
public virtual bool Delete(Expression> predicate, bool isCommit = true)
{
IQueryable entry = (predicate == null) ? _context.Set().AsQueryable() : _context.Set().Where(predicate);
List list = entry.ToList();
if (list != null && list.Count == 0)
{
return false;
}
list.ForEach(item =>
{
_context.Set().Attach(item);
_context.Set().Remove(item);
});
if (isCommit)
{
return _unitOfWork.SaveChanges() > 0;
}
else
{
return false;
}
}
public virtual async Task DeleteAsync(Expression> predicate, bool isCommit = true)
{
IQueryable entry = (predicate == null) ? _context.Set().AsQueryable() : _context.Set().Where(predicate);
List list = entry.ToList();
if (list != null && list.Count == 0)
{
return await Task.Run(() => false);
}
list.ForEach(item =>
{
_context.Set().Attach(item);
_context.Set().Remove(item);
});
if (isCommit)
{
return await Task.Run(() => _unitOfWork.SaveChanges() > 0);
}
else
{
return await Task.Run(() => false);
}
}
public virtual bool DeleteList(List entities, bool isCommit = true)
{
if (entities == null || !entities.Any())
{
return false;
}
entities.ToList().ForEach(item =>
{
_context.Set().Attach(item);
_context.Set().Remove(item);
});
if (isCommit)
{
return _unitOfWork.SaveChanges() > 0;
}
else
{
return false;
}
}
public virtual async Task DeleteListAsync(List entities, bool isCommit = true)
{
if (entities == null || !entities.Any())
{
return await Task.Run(() => false);
}
entities.ToList().ForEach(item =>
{
_context.Set().Attach(item);
_context.Set().Remove(item);
});
if (isCommit)
{
return await Task.Run(() => _unitOfWork.SaveChanges() > 0);
}
else
{
return await Task.Run(() => false);
}
}
public virtual bool DeleteList(List entities, bool isCommit = true) where TEntity : class
{
if (entities == null || !entities.Any())
{
return false;
}
entities.ToList().ForEach(item =>
{
_context.Set().Attach(item);
_context.Set().Remove(item);
});
if (isCommit)
{
return _unitOfWork.SaveChanges() > 0;
}
else
{
return false;
}
}
public virtual async Task DeleteListAsync(List entities, bool isCommit = true) where TEntity : class
{
if (entities == null || !entities.Any())
{
return await Task.Run(() => false);
}
entities.ToList().ForEach(item =>
{
_context.Set().Attach(item);
_context.Set().Remove(item);
});
if (isCommit)
{
return await Task.Run(() => _unitOfWork.SaveChanges() > 0);
}
else
{
return await Task.Run(() => false);
}
}
#endregion
#region 获取多条数据操作
public virtual IQueryable LoadAll(Expression> predicate)
{
return predicate != null ? _context.Set().Where(predicate) : _context.Set().AsQueryable();
}
public virtual async Task> LoadAllAsync(Expression> predicate)
{
return predicate != null ? await Task.Run(() => _context.Set().Where(predicate)) : await Task.Run(() => _context.Set().AsQueryable());
}
public virtual List LoadListAll(Expression> predicate)
{
return predicate != null ? _context.Set().Where(predicate).ToList() : _context.Set().AsQueryable().ToList();
}
public virtual async Task> LoadListAllAsync(Expression> predicate)
{
return predicate != null ? await Task.Run(() => _context.Set().Where(predicate).ToList()) : await Task.Run(() => _context.Set().AsQueryable().ToList());
}
public virtual IQueryable LoadAllBySql(string sql, params DbParameter[] para)
{
return _context.Set().FromSql(sql, para);
}
public virtual async Task> LoadAllBySqlAsync(string sql, params DbParameter[] para)
{
return await Task.Run(() => _context.Set().FromSql(sql, para));
}
public virtual List LoadListAllBySql(string sql, params DbParameter[] para)
{
return _context.Set().FromSql(sql, para).Cast().ToList();
}
public virtual async Task> LoadListAllBySqlAsync(string sql, params DbParameter[] para)
{
return await Task.Run(() => _context.Set().FromSql(sql, para).Cast().ToList());
}
public virtual List QueryEntity(Expression> where, Expression> orderby, Expression> selector, bool isAsc)
where TEntity : class
where TResult : class
{
IQueryable query = _context.Set();
if (where != null)
{
query = query.Where(where);
}
if (orderby != null)
{
query = isAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby);
}
if (selector == null)
{
return query.Cast().ToList();
}
return query.Select(selector).ToList();
}
public virtual async Task> QueryEntityAsync(Expression> where, Expression> orderby, Expression> selector, bool isAsc)
where TEntity : class
where TResult : class
{
IQueryable query = _context.Set();
if (where != null)
{
query = query.Where(where);
}
if (orderby != null)
{
query = isAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby);
}
if (selector == null)
{
return await Task.Run(() => query.Cast().ToList());
}
return await Task.Run(() => query.Select(selector).ToList());
}
public virtual List