• EF操作与Linq写法记录


    项目总结:EF操作与Linq写法记录

    1、EF引入

      新建一个MVC项目之后,要引用EF框架,可以按照以下步骤进行:

      1),在Models中添加项目

      2),选择Entity Data Model,并重新填写名字

      3),选择代码优先之后,选择连接的数据库以及表,之后便生成,此时模型里面的实体就相当于数据库中的表了

    2、Linq与一些lambda写法

      1)、单表查询:

    using (var db = new DBModel())
    {
        DepartmentList = (from n in db.output_Auth where n.badge == badge select n.department).Distinct().ToList<string>();
    }
    //from n(表别名) in table(表格) where n.id == id(条件) select n(查找该表所有),然后后面可以选择筛选的条件,比如.Distinct()FirstOrDefault()Sum()等
    //select 中想要查询具体的某个字段,写法为:select new {n.id, n.name, n.age}等,字段想赋予别名,写法为:select new {anotherID = n.id, anotherName = n.name}

    注:几个本项目中常用的方法:
    1、OrderByDescending(n => n.id); //降序排列
    2、FirstOrDefault(); //获取查询结果的第一行
    3、ToList(); //将查询结果列表化
    4、Distinct(); //将查询结果单一化,类似于SQL中的 distinct
    5、Sum(n => n.id); //结果总和

    剩下的在此次项目中未用到,将来使用到再总结。

      2)、多表查询:

    var time1 = (from a in Table_A join b in Table_B on a.id equals b.id where a.id == id & b.time == timeselect new { a.time, a.data}).ToList();
    //在这里和SQL的多表查询语句写法不太同,on后面的条件写法为: a.x equals b.x

    //补充1:无法直接在 Linq to SQL 的语句中将时间格式化,只能先查询出来了,再在 Linq to Entity 中格式化时间
      即上面查询语句 where b.time == time 中,b.time 不能写成 b.time.ToString("yyyy-MM-dd") 之类的
      只能将查到的时间放在 time1 中,再对时间进行格式化,如下:
      var time2 = (from t in time1 where t.time.GetDataTimeFormats()[5].ToString() == nowDate select new{Data = t.data}).Sum(t => t.Data);
      GetDateTimeFormats()[5]时间格式:yyyy-MM-dd

    //补充2:LinQ to SQL 中查询的结果如果为0,则无法直接使用.Sum()求和,应该先将查询的结果.ToList(),再进行第二步,在 LinQ to Entity 中进行求和。类似于上面的写法,需要写两条语句。

      3)、插入与更新语句

    using (var db = new DBModel())
    {
       //插入之前先查找有没有该数据
    var data = (from tb in db.Table where tb.id == id select tb).FirstOrDefault();
       //如果没有该数据,则执行插入语句
    if (data == null) { var table = new Table();
    table.name = name;
        table.age = age;
    //执行插入操作 db.Table.Add(table);
        db.SaveChanges();
       }
       //如果当月有数据
        else
        {
            //Linq无法直接更新主键的数据,只能是先将此条信息复制出来,把原来的那条数据删除,再重新插入一条修改后的数据,若不是主键数据,则直接更新
            var tableNew = new Table();
    
            tableNew.name = name;
            tableNew.age = age;
    
            db.Table.Remove(data); //移除老数据
            db.Table.Add(tableNew); //添加新数据
            //执行更新操作
            db.SaveChanges();
        }
    }      

    //Lambda 表达式新增写法 :

      var data = db.Table.FirstOrDefault(tb => tb.id == id & tb.name == name);
      if (data == null)
      {
        var table = new Table();

        table.name = name;

        table.age = age;

        db.Table.Add(table);
        db.SaveChanges();
      }

     //Lambda 修改:

      var table = db.Table.FirstOrDefault(tb => tb.id == id);
      table.name = name;
      table.age = age;
      db.SaveChanges();

      4)、删除

    //Lambda表达式写法:
    using (var db = new DBModel())
    {
        var user = db.Table.FirstOrDefault(opAu => opAu.ID == userID);
        db.Table.Remove(user);
        db.SaveChanges();
    }
    
    //Linq写法:
    using (var db = new DBModel())
    {
        var user = (from tb in db.Table select tb).FirstOrDefault();
        db.Table.Remove(tb);
        db.SaveChanges();
    }
  • 相关阅读:
    互联网架构的三马车
    云时代架构读后感
    支付宝架构师眼里的高并发架构
    支付宝架构
    架构层级的“开闭原则”2
    架构层级的“开闭原则”1
    互联网架构微服务
    关于第三方支付
    分布式架构中数据一致性常见的几个问题
    Java多线程学习笔记二
  • 原文地址:https://www.cnblogs.com/ADSR-code/p/10917888.html
Copyright © 2020-2023  润新知