zoukankan      html  css  js  c++  java
  • Linq to SQL 的增删改查操作(附帮助类)

          Linq,全称Language Integrated Query,作为C#3.0新语法,是C#语言的一个扩展,可以将数据查询直接集成到编程语言本身中。 Linq表达式和SQL语句差不多,说白了就是颠倒sql语法, from where select ...,从from开始,以select/group by 结束,输出一个IEnumerable<T>或 IQueryable<T>的集合。世间万物皆系于一箭之上,存在即合理,技术是进步的,还可使用标准化查询运算符(SQO),继承自IEnuberable<T>接口,提供了 筛选、投影、聚合、排序等功能的方法,缺点就是语句太多庞大复杂。优点使用便捷,有即时加载(FindAll)和延时加载(Where)

          EF(Entity Framework)Ado.NET中面向开发数据的一种技术,有Code First、Model First、Database First,是微软的一个ORM框架。

          Lambda表达式的本质就是匿名函数,可以包含表达式和语句,也可以用于创建委托或表达式树类型,运算符为“=>”,读作 goes to,借用MVC企业级实战书中一图

                new Func<string, int>(delegate (string str) { return str.Length; });
    
                (delegate (string str) { return str.Length; });    //匿名方法
    
                (string str) => { return str.Length; };  //Lambda语句
    
                (string str) => str.Length;  //Lambda表达式
    
                (str) => str.Lenth;     //省略类型,让IDE去判断
    
                str => str.Lenth;       //去掉括号

     Linq操作的是数据对象,所以需要先建立一个实体对象模型,操作的表如下

    USE [IBBC]
    GO
    CREATE TABLE [Table_1](
    IDD INT PRIMARY KEY NOT NULL,
    Nnmae VARCHAR(15) NULL    
    )
    
    INSERT [dbo].[Table_1] ([IDD], [Nnmae]) VALUES (100, N'清高祖'),(102, N'清高宗'),
    (103, N'清太祖'),(104, N'Test1'),
    (105, N'Test2'),(106, N'Test3'),
    (107, N'Test4'),(108, N'Test5')

    查询:

    public void Dbquery(int id) 
    {
       IBBCEntities db = new IBBCEntities();
       var request = from d in db.Table_1
              where d.IDD == id
              select new { d.IDD, d.Nnmae };
    foreach (var item in request) { Console.WriteLine("查詢語法: " + item); } var request1 = db.Table_1.SingleOrDefault(b => b.IDD == id); Console.WriteLine("(SQO)方法語法: " +request1.IDD+" "+request1.Nnmae); Console.ReadKey(); }

    添加:

    //添加:
      var add1 = db.Table_1.SingleOrDefault(c=>c.IDD==1010);
       if (add1.IDD.Tostring()==null)
        {
           Table_1 tb = new Table_1
            {
               IDD = 1010,
               Nnmae = "張三丰"
             };
            db.Table_1.Add(tb);
            db.SaveChanges();
         }
         
    (PS:
    add1.IDD为Int类型,所以永远不会等于null,故取其ToString(),下同))

    修改:

    //修改
    var update1 = db.Table_1.SingleOrDefault(c => c.IDD == 1010);
    if (update1.IDD.Tostring()!=null) 
    {
    update1.Nnmae
    = "張君寶";
    db.SaveChanges();
    }

    删除:

    //刪除
     var delete1 = db.Table_1.SingleOrDefault(c=>c.IDD==1010);
     if (delete1.IDD.Tostring()!=null)
    {
    db.Table_1.Remove(delete1);
    db.SaveChanges();
    }

     当然,在选择EF 作为数据ORM时,和以前的SQL 同样需要封装一个帮助类,便于对数据库表的操作,这里网上很多,随手附加一个通用类,当然也可以根据自己的特定业务进行自我拓展。

        /// <summary>
        /// 数据库操作类
        /// </summary>
        public class BaseDAL<T> where T : class
        {
            public StudentQualityEntities db = new StudentQualityEntities();
    
            /// <summary>
            /// 添加实体
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="model"></param>
            /// <returns></returns>
            public int Add(T model)
            {
                try
                {
                    db.Set<T>().Add(model);
                    return db.SaveChanges();
                }
                catch (Exception ex)
                {
                    LogHelper.LogQueue.Enqueue(ex.Message + "--" + ex.StackTrace);
                    return -1;
                }
            }
    
            /// <summary>
            /// 批量添加数据
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="listModel"></param>
            /// <returns></returns>
            public int Add(List<T> listModel)
            {
                listModel.ForEach(i =>
                {
                    db.Set<T>().Add(i);
                });
                return db.SaveChanges();
            }
    
            /// <summary>
            /// 删除数据  实体需包含主键Id
            /// </summary>
            /// <param name="model"></param>
            /// <returns></returns>
            public int Del(T model)
            {
                try
                {
                    db.Set<T>().Attach(model);
                    db.Set<T>().Remove(model);
                    return db.SaveChanges();
                }
                catch (Exception ex)
                {
                    LogHelper.LogQueue.Enqueue(ex.Message + "--" + ex.StackTrace);
                    return -1;
                }
    
    
            }
    
            /// <summary>
            /// 删除多笔数据-条件
            /// </summary>
            /// <param name="delWhere"></param>
            /// <returns></returns>
            public int DelMulBy(Expression<Func<T, bool>> delWhere)
            {
                try
                {
                    //3.1查询要删除的数据
                    List<T> listDeleting = db.Set<T>().Where(delWhere).ToList();
                    //3.2将要删除的数据 用删除方法添加到 EF 容器中
                    listDeleting.ForEach(u =>
                    {
                        db.Set<T>().Attach(u);//先附加到 EF容器
                        db.Set<T>().Remove(u);//标识为 删除 状态
                    });
                    //3.3一次性 生成sql语句到数据库执行删除
                    return db.SaveChanges();
                }
                catch (Exception ex)
                {
                    LogHelper.LogQueue.Enqueue(ex.Message + "--" + ex.StackTrace);
                    return -1;
                }
    
    
            }
    
            /// <summary>
            /// 删除多笔数据 -集合
            /// </summary>
            /// <param name="lis"></param>
            /// <returns></returns>
            public int DelMulList(IQueryable<T> lis)
            {
                try
                {
                    foreach (var item in lis)
                    {
                        db.Set<T>().Attach(item);//先附加到 EF容器
                        db.Set<T>().Remove(item);//标识为 删除 状态
                    }
                    return db.SaveChanges();
    
                }
                catch (Exception ex)
                {
                    LogHelper.LogQueue.Enqueue(ex.Message + "---" + ex.StackTrace);
                    return -1;
                }
            }
    
            /// <summary>
            /// 查询一笔数据
            /// </summary>
            /// <param name="lambda"></param>
            /// <returns></returns>
            public T GetOneEntity(Expression<Func<T, bool>> lambda)
            {
                return db.Set<T>().Where(lambda).FirstOrDefault();
            }
    
    
            /// <summary>
            /// 查询多笔数据+条件
            /// </summary>
            /// <param name="whereLambda"></param>
            /// <returns></returns>
            public IQueryable<T> GetListBy(Expression<Func<T, bool>> lambda)
            {
                return db.Set<T>().Where(lambda);
            }
    
            /// <summary>
            /// 查询多笔数据 条件+排序
            /// </summary>
            /// <typeparam name="TKey"></typeparam>
            /// <param name="whereLambda"></param>
            /// <param name="orderLambda"></param>
            /// <returns></returns>
            public IQueryable<T> GetListBy<TKey>(Expression<Func<T, bool>> lambda, Expression<Func<T, TKey>> orderLambda, int count)
            {
                if (count == 0)
                {
                    return db.Set<T>().Where(lambda).OrderBy(orderLambda);
                }
                return db.Set<T>().Where(lambda).Take(count).OrderBy(orderLambda);
            }
    
            /// <summary>
            /// 修改一笔数据
            /// </summary>
            /// <param name="model"></param>
            /// <param name="proNames"></param>
            /// <returns></returns>
            public int Modify(T model, params string[] proNames)
            {
                //4.1将 对象 添加到 EF中
                DbEntityEntry entry = db.Entry<T>(model);
                //4.2先设置 对象的包装 状态为 Unchanged
                entry.State = System.Data.Entity.EntityState.Unchanged;
                //4.3循环 被修改的属性名 数组
                foreach (string proName in proNames)
                {
                    //4.4将每个 被修改的属性的状态 设置为已修改状态;后面生成update语句时,就只为已修改的属性 更新
                    entry.Property(proName).IsModified = true;
                }
                //4.4一次性 生成sql语句到数据库执行
                return db.SaveChanges();
            }
    
    
            /// <summary>
            /// 批量修改
            /// </summary>
            /// <param name="model">要修改的实体对象</param>
            /// <param name="whereLambda">查询条件</param>
            /// <param name="modifiedProNames">要修改的 属性 名称</param>
            /// <returns></returns>
            public int ModifyBy(T model, Expression<Func<T, bool>> whereLambda, params string[] modifiedProNames)
            {
                //4.1查询要修改的数据
                List<T> listModifing = db.Set<T>().Where(whereLambda).ToList();
                //获取 实体类 类型对象
                Type t = typeof(T); // model.GetType();
                //获取 实体类 所有的 公有属性
                List<PropertyInfo> proInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList();
                //创建 实体属性 字典集合
                Dictionary<string, PropertyInfo> dictPros = new Dictionary<string, PropertyInfo>();
                //将 实体属性 中要修改的属性名 添加到 字典集合中 键:属性名  值:属性对象
                proInfos.ForEach(p =>
                {
                    if (modifiedProNames.Contains(p.Name))
                    {
                        dictPros.Add(p.Name, p);
                    }
                });
                //4.3循环 要修改的属性名
                foreach (string proName in modifiedProNames)
                {
                    //判断 要修改的属性名是否在 实体类的属性集合中存在
                    if (dictPros.ContainsKey(proName))
                    {
                        //如果存在,则取出要修改的 属性对象
                        PropertyInfo proInfo = dictPros[proName];
                        //取出 要修改的值
                        object newValue = proInfo.GetValue(model, null); //object newValue = model.uName;
                        //4.4批量设置 要修改 对象的 属性
                        foreach (T usrO in listModifing)
                        {
                            //为 要修改的对象 的 要修改的属性 设置新的值
                            proInfo.SetValue(usrO, newValue, null); //usrO.uName = newValue;
                        }
                    }
                }
                //4.4一次性 生成sql语句到数据库执行
                return db.SaveChanges();
            }
    
        }

    权当做学习记录

            --市人皆大笑,举手揶揄之

  • 相关阅读:
    近期学习情况
    java连接数据库的两种方法总结
    近两个星期学习成果
    云笔记第一阶段总结
    圆面积
    C++计算器项目的初始部分
    C++视频课程
    A+B Format
    大一下学期的自我目标
    Kohana的请求流
  • 原文地址:https://www.cnblogs.com/Sientuo/p/6163991.html
Copyright © 2011-2022 走看看