• ef操作类


    基于Hi博客的类库 20160811

    using Model;
    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Reflection;
    using System.Runtime.Remoting.Messaging;
    using System.Text;
    
    namespace Comm
    {
        public class Base<T> where T : class
        {
            //更改为存线程内
            MyContext db = dbEntities;  //;// = new Model.qds114576568_dbEntities();      
            private static MyContext dbEntities
            {
                get
                {
                    DbContext dbContext = CallContext.GetData(typeof(Base<T>).Name) as DbContext;
                    if (dbContext == null)
                    {
                        dbContext = new MyContext();
                        //dbContext.Configuration.ValidateOnSaveEnabled = false;
                        //将新创建的 ef上下文对象 存入线程
                        CallContext.SetData(typeof(Base<T>).Name, dbContext);
                    }
                    return dbContext as MyContext;
                }
            }
    
            #region 1.0添加数据 + Add(Tclass model)
            /// <summary>
            /// 1.0添加数据
            /// </summary>
            /// <param name="model"></param>
            public void Add(T model)
            {
                db.Set<T>().Add(model);
            }
            #endregion
    
            #region  2.0 删除方法1 删除给定的对象 +Del(Tclass model)
            /// <summary>
            /// 2.0 删除方法1 删除给定的对象
            /// </summary>
            /// <param name="model"></param>        
            /// <param name="IsSoftDel">是否软删除[*如果是软删除 则自动保存*]</param>
            /// <param name="Pro">软删除 要修改的删除标志字段</param>
            /// <param name="DelTag">软删除 删除标志值</param>
            /// <returns>如果非软删除则永远返回true 可以忽略</returns>
            public void Del(T model, bool IsSoftDel, string Pro = "IsDel", bool DelTag = true)
            {
                if (!IsSoftDel)
                {
                    db.Set<T>().Attach(model);
                    db.Set<T>().Remove(model);
                }
                else
                {
                    var listPro = typeof(T).GetProperties().ToList();
                    for (int i = 0; i < listPro.Count; i++)
                    {
                        if (listPro[i].Name == Pro)
                        {
                            listPro[i].SetValue(model, DelTag, null);
                        }
                    }
                    Up(model, Pro);
                }
            }
            #endregion
    
            #region  2.1 删除方法2 根据条件删除对象 +Del(Expression<Func<Tclass, bool>> delWhere)
            /// <summary>
            /// 2.1 删除方法2 根据条件删除对象 
            /// </summary>
            /// <param name="delWhere">删除条件</param>
            /// <param name="IsSoftDel">是否软删除</param>
            /// <param name="Pro">软删除 要修改的删除标志字段</param>
            /// <param name="DelTag">软删除 删除标志值</param>
            public void Del(Expression<Func<T, bool>> delWhere, bool IsSoftDel, string Pro = "IsDel", bool DelTag = true)
            {
                var modelS = db.Set<T>().Where(delWhere).ToList();
                if (!IsSoftDel)
                {
                    modelS.ForEach(m =>
                   {
                       db.Set<T>().Attach(m);
                       db.Set<T>().Remove(m);
                   });
                }
                else //软删除
                {
                    var listPro = typeof(T).GetProperties().ToList();
                    foreach (var mymodel in modelS)
                    {
                        for (int i = 0; i < listPro.Count; i++)
                        {
                            if (listPro[i].Name == Pro)
                            {
                                listPro[i].SetValue(mymodel, DelTag, null);
                            }
                            if (listPro[i].Name == "UpTime")
                            {
                                listPro[i].SetValue(mymodel, DateTime.Now, null);
                            }
                        }
                    }
                }
            }
            #endregion
    
            #region 3.0 修改方法1 修改某个实体的 某些属性 +Up(Tclass model, params string[] strparams)
            /// <summary>
            /// 3.0 修改方法1 修改某个实体的 某些属性(根据id修改)【*用这个需要注意关闭检查】
            /// </summary>
            /// <param name="model"></param>
            /// <param name="strparams">可变参数</param>
            public void Up(T model, params string[] strparams)
            {
                var m = db.Entry<T>(model);
                m.State = System.Data.Entity.EntityState.Unchanged;
    
                for (int i = 0; i < strparams.Length; i++)
                {
                    m.Property(strparams[i]).IsModified = true;
                }
                m.Property("UpTime").IsModified = true;
            }
    
            #endregion
    
            #region 3.1 修改方法2 根据条件 修改指定的 属性 值 +Up(Expression<Func<Tclass, bool>> upWhere, Tclass model, params string[] strparame)
            /// <summary>
            /// 3.1 修改方法2 根据条件 修改指定的 属性 值
            /// </summary>
            /// <param name="upWhere">要修改的数据的 条件</param>
            /// <param name="IsUpDelData">是否修改已经软删除过的数据</param>
            /// <param name="model">要修改的model对象</param>
            /// <param name="strparame">要修改的字段名</param>
            public void Up(Expression<Func<T, bool>> upWhere, bool IsUpDelData, T model, params string[] strparame)
            {
                var modelS = GetList(upWhere, IsUpDelData).ToList();
    
                var listPro = typeof(T).GetProperties().ToList();
                List<PropertyInfo> dic = new List<PropertyInfo>();
    
                listPro.ForEach(l =>
                {
                    for (int i = 0; i < strparame.Length; i++)
                    {
                        if (l.Name == strparame[i].Trim() || l.Name == "UpTime")
                        {
                            dic.Add(l);
                            break;
                        }
                    }
                });
    
                if (dic.Count > 0)
                {
                    foreach (var property in dic)
                    {
                        var newValue = property.GetValue(model, null);
                        foreach( var mymodel in modelS)
                        {
                            property.SetValue(mymodel, newValue, null);
    
                        }
                    }
                }
            
            }
            #endregion
    
            #region  4.0 查询方法 +GetList<Tkey>(Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
            /// <summary>
            /// 4.0 查询方法 
            /// </summary>
            /// <typeparam name="Tkey">如果strOrederBy为null Tkey也可以DBNull</typeparam>
            /// <param name="strWhere">查询条件</param>
            /// <param name="SelectDelData">查询的结果集中 是否包括 已经软删除的数据</param>
            /// <param name="strOrederBy">排序条件</param>
            /// <param name="order">是否升序</param>
            ///  <param name="tableName">连接查询 的表名</param>
            /// <returns></returns>
            public IQueryable<T> GetList(Expression<Func<T, bool>> strWhere, bool SelectDelData = false, bool isAsNoTracking = true, string tableName = null)
            {
                Expression<Func<T, bool>> exp = strWhere;
                //if (!SelectDelData)
                //    AddLinq.And(exp, GetWhereIsDel());
    
                IQueryable<T> t = null;
    
                if (isAsNoTracking)
                {
                    if (string.IsNullOrEmpty(tableName))
                        t = db.Set<T>().AsNoTracking().Where(exp);
                    else
                        t = db.Set<T>().Include(tableName).AsNoTracking().Where(exp);
                }
                else
                {
                    if (string.IsNullOrEmpty(tableName))
                        t = db.Set<T>().Where(exp);
                    else
                        t = db.Set<T>().Include(tableName).Where(exp);
                }
                return t;
            }
            /// <summary>
            /// 4.0.2 查询方法 
            /// </summary>
            /// <typeparam name="Tkey">如果strOrederBy为null Tkey也可以DBNull</typeparam>
            /// <param name="strWhere">查询条件</param>
            /// <param name="SelectDelData">查询的结果集中 是否包括 已经软删除的数据</param>
            /// <param name="strOrederBy">排序条件</param>
            /// <param name="order">是否升序</param>
            ///  <param name="tableName">连接查询 的表名</param>
            /// <returns></returns>
            public IQueryable<T> GetList<TTb>(Expression<Func<T, bool>> strWhere, bool SelectDelData = false, bool isAsNoTracking = true, Expression<Func<T, TTb>> tableName = null)
            {
                Expression<Func<T, bool>> exp = strWhere;
                //if (!SelectDelData)
                //    exp = AddLinq.And(exp, GetWhereIsDel());//合并 排除一删除查询条件 
    
                IQueryable<T> t = null;
                if (isAsNoTracking)
                    if (null == tableName)
                        t = db.Set<T>().AsNoTracking().Where(exp);
                    else
                        t = db.Set<T>().Include(tableName).AsNoTracking().Where(exp);
                else
                    if (null == tableName)
                    t = db.Set<T>().Where(exp);
                else
                    t = db.Set<T>().Include(tableName).Where(exp);
    
                return t;
            }
    
            #endregion
            #region 4.1 查询方法2 分页查询 +GetList<Tkey>(int indexPage, int sizePage, Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
            /// <summary>
            /// 4.1 查询方法2 分页查询
            /// </summary>
            /// <typeparam name="Tkey">如果strOrederBy为null Tkey也可以DBNull</typeparam>
            /// <param name="indexPage">页码(从1开始)</param>
            /// <param name="sizePage">页容量</param>
            /// <param name="total">总页数</param>
            /// <param name="strWhere">查询条件</param>
            /// <param name="SelectDelData">查询的结果集中 是否包括 已经软删除的数据</param>
            /// <param name="strOrederBy">排序字段</param>
            /// <param name="order">是否升序</param>
            ///  <param name="tableName">连接查询 的表名</param>
            /// <returns></returns>
            public IQueryable<T> GetList<Tkey>(int indexPage, int sizePage, out int total, Expression<Func<T, bool>> strWhere, bool SelectDelData = false, Expression<Func<T, Tkey>> strOrederBy = null, bool order = true, bool isAsNoTracking = true, string tableName = null)
            {
                Expression<Func<T, bool>> exp = strWhere;
                //if (!SelectDelData)
                //    exp = AddLinq.And(exp, GetWhereIsDel());//合并 排除一删除查询条件 
    
                IQueryable<T> t = null;
                if (isAsNoTracking)
                    if (string.IsNullOrEmpty(tableName))
                        t = db.Set<T>().AsNoTracking().Where(exp);
                    else
                        t = db.Set<T>().Include(tableName).AsNoTracking().Where(exp);
                else
                    if (string.IsNullOrEmpty(tableName))
                    t = db.Set<T>().Where(exp);
                else
                    t = db.Set<T>().Include(tableName).Where(exp);
    
                if (strOrederBy != null)
                {
                    if (order)
                        t = t.OrderBy(strOrederBy);
                    else
                        t = t.OrderByDescending(strOrederBy);
                }
                int count = t.Count();
                total = count / sizePage + (count % sizePage > 0 ? 1 : 0);
                return t.Skip((indexPage - 1) * sizePage).Take(sizePage);
            }
    
            /// <summary>
            /// 4.1.2 查询方法2 分页查询
            /// </summary>
            /// <typeparam name="Tkey">如果strOrederBy为null Tkey也可以DBNull</typeparam>
            /// <param name="indexPage">页码(从1开始)</param>
            /// <param name="sizePage">页容量</param>
            /// <param name="total">总页数</param>
            /// <param name="strWhere">查询条件</param>
            /// <param name="SelectDelData">查询的结果集中 是否包括 已经软删除的数据</param>
            /// <param name="strOrederBy">排序字段</param>
            /// <param name="order">是否升序</param>
            ///  <param name="tableName">连接查询 的表名</param>
            /// <returns></returns>
            public IQueryable<T> GetList<Tkey, TTb>(int indexPage, int sizePage, out int total, Expression<Func<T, bool>> strWhere, bool SelectDelData = false, Expression<Func<T, Tkey>> strOrederBy = null, bool order = true, bool isAsNoTracking = true, Expression<Func<T, TTb>> tableName = null)
            {
                Expression<Func<T, bool>> exp = strWhere;
                //if (!SelectDelData)
                //    exp = AddLinq.And(exp, GetWhereIsDel());//合并 排除一删除查询条件 
    
                IQueryable<T> t = null;
                if (isAsNoTracking)
                    if (null == tableName)
                        t = db.Set<T>().AsNoTracking().Where(exp);
                    else
                        t = db.Set<T>().Include(tableName).AsNoTracking().Where(exp);
                else
                    if (null == tableName)
                    t = db.Set<T>().Where(exp);
                else
                    t = db.Set<T>().Include(tableName).Where(exp);
    
                if (strOrederBy != null)
                {
                    if (order)
                        t = t.OrderBy(strOrederBy);
                    else
                        t = t.OrderByDescending(strOrederBy);
                }
                int count = t.Count();
                total = count / sizePage + (count % sizePage > 0 ? 1 : 0);
                return t.Skip((indexPage - 1) * sizePage).Take(sizePage);
            }
    
    
            #endregion
            #region 5.0 返回 已经删除的 linq 拼接条件
            /// <summary>
            /// 返回 已经删除的 linq 拼接条件
            /// </summary>
            /// <returns></returns>
            //private static Expression<Func<T, bool>> GetWhereIsDel()
            //{
            //    return t => t.IsDel == false;
            //}
            #endregion
    
            #region 提交 +save()
            /// <summary>
            /// 提交
            /// </summary>
            /// <param name="ValidateOnSaveEnabled">是否打开验证</param>
            /// <returns></returns>
            public int save(bool ValidateOnSaveEnabled = true)
            {
                db.Configuration.ValidateOnSaveEnabled = ValidateOnSaveEnabled;
                return db.SaveChanges();
            }
    
            public static int StaticSave(bool ValidateOnSaveEnabled = true)
            {
                dbEntities.Configuration.ValidateOnSaveEnabled = ValidateOnSaveEnabled;
                return dbEntities.SaveChanges();
            }
    
            #endregion
        }
    }
    View Code
  • 相关阅读:
    多校第四场
    codechef 两题
    Topcoder 多校T-shirt场
    状态压缩DP
    LUCAS 定理
    HDU 1104 Remainder
    HDU4542 小明系列故事——未知剩余系
    Codeforces Round #256 (Div. 2)
    Codeforces Round #FF (Div. 2)
    2016年川师大软件工程学生博客打分
  • 原文地址:https://www.cnblogs.com/0to9/p/5762928.html
Copyright © 2020-2023  润新知