|
|
using NFine.Code; using System; using System.Collections.Generic; using System.Data.Common; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Text.RegularExpressions;
namespace NFine.Data { /// <summary>
/// 仓储实现
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public class RepositoryBase<TEntity> : IRepositoryBase<TEntity> where TEntity : class,new() { public NFineDbContext dbcontext = new NFineDbContext(); public int Insert(TEntity entity) { dbcontext.Entry<TEntity>(entity).State = EntityState.Added; return dbcontext.SaveChanges(); } public int Insert(List<TEntity> entitys) { foreach (var entity in entitys) { dbcontext.Entry<TEntity>(entity).State = EntityState.Added; } return dbcontext.SaveChanges(); } public int Update(TEntity entity) { RemoveHoldingEntityInContext(entity); dbcontext.Set<TEntity>().Attach(entity); PropertyInfo[] props = entity.GetType().GetProperties(); foreach (PropertyInfo prop in props) { if (prop.GetValue(entity, null) != null) { if (prop.GetValue(entity, null).ToString() == " ") dbcontext.Entry(entity).Property(prop.Name).CurrentValue = null; dbcontext.Entry(entity).Property(prop.Name).IsModified = true; } } return dbcontext.SaveChanges(); }
//用于监测Context中的Entity是否存在,如果存在,将其Detach,防止出现问题。
private Boolean RemoveHoldingEntityInContext(TEntity entity) { var objContext = ((IObjectContextAdapter)dbcontext).ObjectContext; var objSet = objContext.CreateObjectSet<TEntity>(); var entityKey = objContext.CreateEntityKey(objSet.EntitySet.Name, entity);
Object foundEntity; var exists = objContext.TryGetObjectByKey(entityKey, out foundEntity);
if (exists) { objContext.Detach(foundEntity); }
return (exists); }
public int Delete(TEntity entity) { dbcontext.Set<TEntity>().Attach(entity); dbcontext.Entry<TEntity>(entity).State = EntityState.Deleted; return dbcontext.SaveChanges(); } public int Delete(Expression<Func<TEntity, bool>> predicate) { var entitys = dbcontext.Set<TEntity>().Where(predicate).ToList(); entitys.ForEach(m => dbcontext.Entry<TEntity>(m).State = EntityState.Deleted); return dbcontext.SaveChanges(); } public TEntity FindEntity(object keyValue) { return dbcontext.Set<TEntity>().Find(keyValue); } public TEntity FindEntity(Expression<Func<TEntity, bool>> predicate) { return dbcontext.Set<TEntity>().FirstOrDefault(predicate); } public IQueryable<TEntity> IQueryable() { return dbcontext.Set<TEntity>(); } public IQueryable<TEntity> IQueryable(Expression<Func<TEntity, bool>> predicate) { return dbcontext.Set<TEntity>().Where(predicate); } public List<TEntity> FindList(string strSql) { return dbcontext.Database.SqlQuery<TEntity>(strSql).ToList<TEntity>(); } public List<TEntity> FindList(string strSql, DbParameter[] dbParameter) { return dbcontext.Database.SqlQuery<TEntity>(strSql, dbParameter).ToList<TEntity>(); } public List<TEntity> FindList(Pagination pagination) { bool isAsc = pagination.sord.ToLower() == "asc" ? true : false; string[] _order = pagination.sidx.Split(','); MethodCallExpression resultExp = null; var tempData = dbcontext.Set<TEntity>().AsQueryable(); foreach (string item in _order) { string _orderPart = item; _orderPart = Regex.Replace(_orderPart, @"\s+", " "); string[] _orderArry = _orderPart.Split(' '); string _orderField = _orderArry[0]; bool sort = isAsc; if (_orderArry.Length == 2) { isAsc = _orderArry[1].ToUpper() == "ASC" ? true : false; } var parameter = Expression.Parameter(typeof(TEntity), "t"); var property = typeof(TEntity).GetProperty(_orderField); var propertyAccess = Expression.MakeMemberAccess(parameter, property); var orderByExp = Expression.Lambda(propertyAccess, parameter); resultExp = Expression.Call(typeof(Queryable), isAsc ? "OrderBy" : "OrderByDescending", new Type[] { typeof(TEntity), property.PropertyType }, tempData.Expression, Expression.Quote(orderByExp)); } tempData = tempData.Provider.CreateQuery<TEntity>(resultExp); pagination.records = tempData.Count(); tempData = tempData.Skip<TEntity>(pagination.rows * (pagination.page - 1)).Take<TEntity>(pagination.rows).AsQueryable(); return tempData.ToList(); } public List<TEntity> FindList(Expression<Func<TEntity, bool>> predicate, Pagination pagination) { bool isAsc = pagination.sord.ToLower() == "asc" ? true : false; string[] _order = pagination.sidx.Split(','); MethodCallExpression resultExp = null; var tempData = dbcontext.Set<TEntity>().Where(predicate); foreach (string item in _order) { string _orderPart = item; _orderPart = Regex.Replace(_orderPart, @"\s+", " "); string[] _orderArry = _orderPart.Split(' '); string _orderField = _orderArry[0]; bool sort = isAsc; if (_orderArry.Length == 2) { isAsc = _orderArry[1].ToUpper() == "ASC" ? true : false; } var parameter = Expression.Parameter(typeof(TEntity), "t"); var property = typeof(TEntity).GetProperty(_orderField); var propertyAccess = Expression.MakeMemberAccess(parameter, property); var orderByExp = Expression.Lambda(propertyAccess, parameter); resultExp = Expression.Call(typeof(Queryable), isAsc ? "OrderBy" : "OrderByDescending", new Type[] { typeof(TEntity), property.PropertyType }, tempData.Expression, Expression.Quote(orderByExp)); } tempData = tempData.Provider.CreateQuery<TEntity>(resultExp); pagination.records = tempData.Count(); tempData = tempData.Skip<TEntity>(pagination.rows * (pagination.page - 1)).Take<TEntity>(pagination.rows).AsQueryable(); return tempData.ToList(); } } }
|