zoukankan      html  css  js  c++  java
  • EF泛型封装CRUD

    最近刚研究EF,自己做了几个增删改查例子之后,发现有好多代码是重复的,一般的重复代码我都会尝试去封装。

    在这期间主要遇到的问题是查询或删除时需要主键,而泛型T 中根本无法事先知晓主键是那个,后来研究才知道这个地方可以先表达式,

    即:Expression<Func<T, bool>> express

    直接上代码

    ------------------------ 

    添加数据:

            /// <summary>
            /// 添加某一模型到数据中
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="model"></param>
            public int Add<T>(T model) where T : class
            {
                using (DBSetting db = new DBSetting())
                {
                    db.Set<T>().Add(model);
                    return db.SaveChanges();
                }
            }
    View Code

     修改数据:

    /// <summary>
            /// 修改某一模型数据
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="model"></param>
            public void Modify<T>(T model) where T : class
            {
                using (DBSetting db = new DBSetting())
                {
                    if (db.Entry<T>(model).State == EntityState.Detached)
                    {
                        db.Set<T>().Attach(model);
                        db.Entry<T>(model).State = EntityState.Modified;
                    }
                    db.SaveChanges();
                }
            }
    View Code

    删除和批量删除:

    /// <summary>
            /// Author: 严智远  Remark:  删除某一主键的相关信息   Date:  2013年7月2日11:00:12
            /// </summary>
            /// <typeparam name="T">数据模型</typeparam>
            /// <param name="express">主键参数</param>
            public void Delete<T>(Expression<Func<T, bool>> express) where T : class
            {
                using (DBSetting db = new DBSetting())
                {
                    T v = db.Set<T>().SingleOrDefault(express);
                    if (v == null)
                    {
                        return;
                    }
                    db.Set<T>().Remove(v);
                    db.SaveChanges();
                }
            }
    
            /// <summary>
            /// Author: 严智远  Remark:  批量删除信息   Date:  2013年7月2日13:30:11
            /// </summary>
            /// <typeparam name="T">模型</typeparam>
            /// <param name="Ids">页面主键集合IEnumerable<string> Ids</param>
            /// <param name="express"></param>
            /// 调用方式:
            /// 1. List<string> lstId = Ids as List<string> ?? Ids.ToList();
            /// 2. new PublicOP().DeleteLst<Main_Department>(m => lstId.Contains(m.DepartmentID));
            public void DeleteLst<T>(Expression<Func<T, bool>> express) where T : class
            {
                using (DBSetting db = new DBSetting())
                {
                    db.Set<T>().Delete(express);
                }
            }
    View Code

    查询T或IEnumerable<T>:

     /// <summary>
            ///  Author: 严智远   Remark: 根据主键条件获取相关信息  Date: 2013年7月2日10:55:16
            /// </summary>
            /// <typeparam name="T">数据模型</typeparam>
            /// <param name="express">主键参数</param>
            /// <returns></returns>
            public T GetInfo<T>(Expression<Func<T, bool>> express) where T : class
            {
                using (DBSetting db = new DBSetting())
                {
                    return db.Set<T>().SingleOrDefault(express);
                }
            }
    
            /// <summary>
            /// Author: 严智远   Remark: 根据参数1的条件获取相关信息  Date: 2013年7月2日10:52:57
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="express">参数条件</param>
            /// <returns></returns>
            public IEnumerable<T> GetInfoLst<T>(Expression<Func<T, bool>> express) where T : class
            {
                using (DBSetting db = new DBSetting())
                {
                    return db.Set<T>().Where(express).ToList();
                }
            }
    View Code

    最后一个获取主键方法:(调用的时候注意,不能直接c=>c.字段=="值",而是要用主键如DepId=>DepId.DepId=="dep001",之所以这样是因为反射需要获取T中主键值)

    /// <summary>
            /// 获取下一列主键的值
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="model"></param>
            /// <param name="orderKey"></param>
            /// <param name="headName"></param>
            /// <returns></returns>
            public string GetNextKey<T>(Expression<Func<T, string>> express, string headName) where T : class
            {
                using (DBSetting db = new DBSetting())
                {
    
                    T v = db.Set<T>().OrderByDescending(express).FirstOrDefault();
                    if (v == null)
                    {
                        return headName + "0001";
                    }
                    else
                    {
                        //通过反射获取主键
                        object obj = v.GetType().GetProperty(express.Parameters[0].Name).GetValue(v, null);
    
                        //将字符剔除掉,仅剩余数字
                        int tempInt = Convert.ToInt32(obj.ToString().Replace(headName, ""));
                        tempInt++;
    
                        return "DEP" + tempInt.ToString("D4");
                    }
                }
            }
    View Code

     ---------------

    以上仅是个人封装的一些简单方法,当然还有更多更好的方法。

  • 相关阅读:
    JVM内存结构
    JVM中的类加载
    数据库索引详解
    Spring IOC 总结
    Java多线程(一)—— 常见问题整理
    Java集合框架 面试问题整理
    Java8 Lambda表达式
    vue开发技巧
    mysql(MariaDB)问题处理
    字符串非空判断的效率问题
  • 原文地址:https://www.cnblogs.com/yanzhiyuan928/p/3166994.html
Copyright © 2011-2022 走看看