1 因为要使用实体数据模型快速生成数据的实体类,所以不想写父类,就不能用继承方法
2 在这种前提下写一个静态的帮助类 快速查找 和修改 插入 删除 数据
对Linq帮助
构建Expression条件,创建一个相等的条件表达式= where a.id=?
public static Expression<Func<T, bool>> getEqualExpress<T>(string propertyName, object value) where T:class
{
ParameterExpression param = Expression.Parameter(typeof(T), "c");
Expression left = Expression.Property(param, typeof(T).GetProperty(propertyName));
Expression right = Expression.Constant(value, value.GetType());
BinaryExpression filter = Expression.Equal(left, right);
return Expression.Lambda<Func<T, bool>>(filter, param);
}
3创建一个通过id获取实体类方法
// /// <summary>
// /// 通过id获取实体类
// /// </summary>
// /// <param name="whereLambda"></param>
// /// <returns></returns>
public T GetModelById<T>(DbContext db, int id) where T : class
{
Expression<Func<T, bool>> whereLambda = LinqWhereHelper.getEqualExpress<T>("id", id);
return db.Set<T>().Where(whereLambda).FirstOrDefault();
}
2 自定以排序后分页
1 先创建 自定义排序方法
public static IQueryable<T> OrderByField<T>(this IQueryable<T> data, string fieldName, bool desc)
{
if (fieldName == null || typeof(T).GetProperty(fieldName) == null)
return data;
var type = typeof(T);
var property = type.GetProperty(fieldName);
var param = Expression.Parameter(typeof(T), "i");
var propertyAcess = Expression.MakeMemberAccess(param, property);
var sortExpression = Expression.Lambda(propertyAcess, param);
var cmd = desc ? "OrderByDescending" : "OrderBy";
var result = Expression.Call(
typeof(Queryable),
cmd,
new Type[] { type, property.PropertyType },
data.Expression,
Expression.Quote(sortExpression));
return data.Provider.CreateQuery<T>(result);
}
2 加入排序方法
public static IQueryable<T> ToPage<T, TKey>(IQueryable<T> allItems, int pageIndex, int pageSize, string fieldName, bool desc)
{
if (pageIndex < 1)
pageIndex = 1;
var itemIndex = (pageIndex - 1) * pageSize;
allItems = LinqWhereHelper.OrderByField(allItems, fieldName, desc);
var pageOfItems = allItems.Skip(itemIndex).Take(pageSize);
return pageOfItems;
}
完整帮助类
public class DbContextHelp
{
//插入实体类
public static T Insert<T>(DbContext db,T entity) where T : class
{
db.Set<T>().Add(entity);
db.SaveChanges();
return entity;
}
public static T InsertNo<T>(DbContext db, T entity) where T : class
{
db.Set<T>().Add(entity);
return entity;
}
//更新实体类
public static void Update<T>(DbContext db, T entity) where T : class
{
var set = db.Set<T>();
set.Attach(entity);
db.Entry(entity).State = EntityState.Modified;
db.SaveChanges();
}
public static void UpdateNo<T>(DbContext db, T entity) where T : class
{
var set = db.Set<T>();
set.Attach(entity);
db.Entry(entity).State = EntityState.Modified;
}
public static void Updates<T>(DbContext db, params T[] entitys) where T : class
{
foreach(var entity in entitys)
{
var set = db.Set<T>();
set.Attach(entity);
db.Entry(entity).State = EntityState.Modified;
}
db.SaveChanges();
}
public static void Delete<T>(DbContext db, T entity) where T : class
{
db.Set<T>().Remove(entity);
db.Entry<T>(entity).State = EntityState.Deleted;
db.SaveChanges();
}
public static void DeleteNo<T>(DbContext db, T entity) where T : class
{
db.Set<T>().Remove(entity);
db.Entry<T>(entity).State = EntityState.Deleted;
}
// #region 5.2 根据条件查询一个实体 +T GetBy(Expression<Func<T, bool>> whereLambda)
// /// <summary>
// ///
// /// </summary>
// /// <param name="whereLambda"></param>
// /// <returns></returns>
public T GetBy<T>(DbContext db,Expression<Func<T, bool>> whereLambda) where T : class
{
return db.Set<T>().Where(whereLambda).FirstOrDefault();
}
// /// <summary>
// /// 通过id获取实体类
// /// </summary>
// /// <param name="whereLambda"></param>
// /// <returns></returns>
public static T GetModelById<T>(DbContext db, int id) where T : class
{
Expression<Func<T, bool>> whereLambda = LinqWhereHelper.getEqualExpress<T>("id", id);
return db.Set<T>().Where(whereLambda).FirstOrDefault();
}
public static void updateConfig(DbContext db)
{
db.Configuration.LazyLoadingEnabled = false;
db.Configuration.ProxyCreationEnabled = false;
}
public static void selectConfig(DbContext db)
{
db.Configuration.AutoDetectChangesEnabled = false;
db.Configuration.ValidateOnSaveEnabled = false;
db.Configuration.LazyLoadingEnabled = false;
db.Configuration.ProxyCreationEnabled = false;
}
public static IQueryable<T> ToPage<T>(IQueryable<T> allItems, int pageIndex, int pageSize)
{
if (pageIndex < 1)
pageIndex = 1;
var itemIndex = (pageIndex - 1) * pageSize;
var pageOfItems = allItems.Skip(itemIndex).Take(pageSize);
return pageOfItems;
}
public static IQueryable<T> ToPage<T, TKey>(IQueryable<T> allItems, int pageIndex, int pageSize, string fieldName, bool desc)
{
if (pageIndex < 1)
pageIndex = 1;
var itemIndex = (pageIndex - 1) * pageSize;
allItems = LinqWhereHelper.OrderByField(allItems, fieldName, desc);
var pageOfItems = allItems.Skip(itemIndex).Take(pageSize);
return pageOfItems;
}
public static IQueryable<T> orderToPage<T, TKey>(IQueryable<T> allItems, int pageIndex, int pageSize)
{
if (pageIndex < 1)
pageIndex = 1;
var itemIndex = (pageIndex - 1) * pageSize;
allItems = LinqWhereHelper.OrderByField(allItems, "id", true);
var pageOfItems = allItems.Skip(itemIndex).Take(pageSize);
return pageOfItems;
}
}
之所以要写Insert 和InsertNo两个类似的方法
是在多次插入的时候 最后统一提交请求
db.SaveChanges();