LINQ 帮助类的实现以及使用方法总结 条件表达式Expression的使用

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();

猜你喜欢

转载自blog.csdn.net/qq_25744257/article/details/81536143