1 public class Repository<T> : IRepository<T> where T : class 2 { 3 public WBIDbContext m_Context=WBIContextFactory.GetCurrentContext();//上下文数据库 4 public DbSet<T> dbSet; 5 public Repository(WBIDbContext dbContext) 6 { 7 this.m_Context = dbContext; 8 this.dbSet = dbContext.Set<T>(); 9 } 10 11 protected IRepository<T> m_currentRepository1 { get; set; } 12 protected IDevTypeRepository m_currentRepository { get; set; } 13 public Repository(IDevTypeRepository currentRepository) 14 { 15 m_currentRepository = currentRepository; 16 } 17 18 public T Add(T entity) 19 { 20 //设置实体的状态 add 21 m_Context.Entry<T>(entity).State = System.Data.Entity.EntityState.Added; 22 //将上下文中所做的更改保存到数据库中 23 m_Context.SaveChanges(); 24 //返回保存后的实体 25 return entity; 26 } 27 28 public bool Update(T entity) 29 { 30 m_Context.Set<T>().Attach(entity); 31 m_Context.Entry<T>(entity).State = System.Data.Entity.EntityState.Modified; 32 return m_Context.SaveChanges() > 0; 33 } 34 35 public bool Delete(T entity) 36 37 { 38 m_Context.Set<T>().Attach(entity); 39 m_Context.Entry<T>(entity).State = System.Data.Entity.EntityState.Deleted; 40 return m_Context.SaveChanges() > 0; 41 } 42 43 //名字是否为空 44 public bool CheckNameIsEmpty(Expression<Func<T, bool>> whereLambda) 45 { 46 return m_Context.Set<T>().Any(whereLambda); 47 } 48 49 //名字是否存在 50 public bool CheckNameExist(Expression<Func<T, bool>> whereLambda) 51 { 52 return m_Context.Set<T>().Any(whereLambda); 53 } 54 //检查其他项 55 public bool Check(Expression<Func<T, bool>> whereLambda) 56 { 57 return m_Context.Set<T>().Any(whereLambda); 58 } 59 //保存 60 //public void Save() 61 //{ 62 // m_Context.SaveChanges(); 63 64 //} 65 66 public int Count(Expression<Func<T, bool>> predicate) 67 { 68 return m_Context.Set<T>().Count(predicate); 69 } 70 71 public List<T> ToList() 72 { 73 return m_Context.Set<T>().ToList(); 74 } 75 76 public T Find(Expression<Func<T, bool>> whereLambda) 77 { 78 T entity = m_Context.Set<T>().FirstOrDefault<T>(whereLambda); 79 return entity; 80 } 81 82 public IQueryable<T> FindList(Expression<Func<T, bool>> whereLamba, string orderName, bool isAsc) 83 { 84 var list = m_Context.Set<T>().Where(whereLamba); 85 list = OrderBy(list, orderName, isAsc); 86 return list; 87 } 88 89 public IQueryable<T> FindList<S>(Expression<Func<T, bool>> whereLambda, bool isAsc, Expression<Func<T, S>> orderLamba) 90 { 91 var list = m_Context.Set<T>().Where<T>(whereLambda); 92 if (isAsc) 93 { 94 list = list.OrderBy<T, S>(orderLamba); 95 } 96 else 97 { 98 list = list.OrderByDescending<T, S>(orderLamba);//降序排列 99 } 100 return list; 101 } 102 103 104 105 106 public IQueryable<T> FindPageList<S>(int pageIndex, int pageSize, out int totalRecordCnt, 107 Expression<Func<T, bool>> whereLamdba, bool isAsc, Expression<Func<T, S>> orderLambda) 108 { 109 var list = m_Context.Set<T>().Where<T>(whereLamdba); 110 totalRecordCnt = list.Count(); 111 112 if (isAsc) 113 { 114 list = list.OrderBy<T, S>(orderLambda) 115 .Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize); 116 } 117 else 118 { 119 list = list.OrderByDescending<T, S>(orderLambda) 120 .Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize); 121 } 122 123 return list; 124 } 125 126 127 128 #region Private Methods 129 /// <summary> 130 /// 排序 131 /// </summary> 132 /// <typeparam name="T">类型</typeparam> 133 /// <param name="source">原IQueryable</param> 134 /// <param name="propertyName">排序属性名</param> 135 /// <param name="isAsc">是否升序</param> 136 /// <returns>排序后的IQueryable</returns> 137 private IQueryable<T> OrderBy(IQueryable<T> source, string propertyName, bool isAsc) 138 { 139 if (source == null) 140 { 141 throw new ArgumentNullException("source", "不能为空"); 142 } 143 if (string.IsNullOrEmpty(propertyName)) 144 { 145 return source; 146 } 147 var parameter = Expression.Parameter(source.ElementType); 148 var property = Expression.Property(parameter, propertyName); 149 if (property == null) 150 { 151 throw new ArgumentNullException("propertyName", "属性不存在"); 152 } 153 var lambda = Expression.Lambda(property, parameter); 154 var methodName = isAsc ? "OrderBy" : "OrderByDescending"; 155 var resultExpression = Expression.Call(typeof(Queryable), methodName, 156 new Type[] { source.ElementType, property.Type }, source.Expression, Expression.Quote(lambda)); 157 return source.Provider.CreateQuery<T>(resultExpression); 158 } 159 #endregion 160 }