第一次课 框架技术:基本功能封装好,程序员直接使用
    分类:
    数据访问层框架(简化数据访问)
    业务层框架
    表示层框架
ORM:object对象与关系relation映射Mapping,数据访问层框架技术
    Linq to sql
    EF 实体模型
    NHbinate等
    baits等
    ...
  //前提:每一个表必须有主键
  //在项目新建ADO.net实体对象模型,自动生成访问操作的上下文入口,
  及实体类。
  1获取所有数据代码1:
     //定义上下文对象
           上下文类名 context = new 上下文类名();
        //上下文对象.对应表集合.toList
      this.dataGridView1.DataSource = context.Grade.ToList();
  2.增加数据
            先定义要增加的对象
            Grade grade = new Grade { NJName = this.textBox1.Text };
            //1.往集合中增加对象
            y2Net22DBEntities context = new y2Net22DBEntities();
            //对象加入到集合中
            context.Grade.Add(grade);
            //2.同步数据库
            context.SaveChanges();
  3.修改数据
          //修改,根据条件在上下文获取到数据集合中的一个对象
            y2Net22DBEntities context = new y2Net22DBEntities();
            var gr = context.Grade.Single(p => p.NJId == id);//查询一个对象
            gr.NJName = this.textBox2.Text;//改属性
            //同步
            int n=context.SaveChanges();
  4.删除:找到上下文中的一个对象
     y2Net22DBEntities context = new y2Net22DBEntities();
     var gr= context.Grade.Single(p => p.NJId == id);//查询一个对象
     context.Grade.Remove(gr);
     //同步
     context.SaveChanges();
从一层可以看出EF代替了模型层与基本的数据访问的ADO.net操作
  i)如果在三层中实现,EF可以放在Model中,也可以在数据访问层
 ii)在DAL需要添加EF的引用
 iii)需要在model中的app.config中的连接字符串,复制放到表示层的web.config中
第二次
Linq技术
一:C#新的语法与功能
    LINQ( Language 11Query )即语言集成查询
    LINQ 是一组语言特性和API,使得你可以使用统一的方式
    编写各种查询。
    查询的对象包括XML、对象集合、SQL Server 数据库等等。
  
    where方法:用于筛选数据 
    返回类型为 var aa=集合.Where(p=> 条件);
   
    select方法:用于定义显示的列
    返回类型 var bb=集合.Select( p=> p );
                         Select(p=> new { p.属性1....}
   
    Single方法:用于在集合中查询一个对象
     返回类型  对象类型 bb=集合.Singel(p=>条件);
     注意:如果有多个对象返回,将出错。
    Orderby方法:用来集合按列名升序排列
    OrderByDescending(p=>p.属性) 用来集合按属性降序排列
   ///////有筛选,有排序,写的先后顺序//////////////
   //先写where,再写排序order,最后写显示select
   /////////////////////   
   Linq语法两种写法 :语句式,方法式
   1.方法式:  var aa=集合.方法(参数);
   2.语句式:   var aa=from 变量名  in 集合
                      where 条件
        order 属性名 
                      select 变量名 ;
    注意:语句式比方法式运行效率低
          语法先写where ,再写排序, 最后写select

    Max   最大值 (只能是一个属性的集合)
    Min   最小值
    Count  计数
    Average   平均值
    Sum       求和
    Skip      跳过几条 skip(数字)
    Take      取集合中的几个对象 take(数字)
  
知识点:委托
 1.是C#中一种类型,本质是一种特殊的类。定义在命名空间中。
   C#类型:类,接口,枚举,结构,委托
 2.C#委托,特殊的类,用来指代行为。初始化时关联方法。
   1)定义委托 public delegate 返回值类型 委托名(方法参数)
   2)关联方法 委托类型 对象=new 委托类型名(方法名)
   3)调用委托  对象(实参) 实际实现的结果为指代的方法。
 3.多态:同一行语句,有不同的运行结果.
     实现方法(方法重写,接口,委托...)
 4.委托可以作为方法的参数,调用委托作为参数的方法,必须用
   一个方法作为实参调用。
  事件:事件就是委托对象
 5. Lambda表达式  格式  (  方法参数  )=> {  方法体}
    本质就是一个功能性方法. =>运算式 用来分隔参数与方法体
    参数只用一个,方法体只一个语句,()可以省略掉
 6.使用Lambda表达式之前,先定义一个委托,需要关联方法时,
   用Lamdba表达式与之关联。
 7.框架定义了两个常见委托Action,Func,看到Action,Func作为参数
   可以代替大多数方法
Action用来代替没有返回值,可以用任何多参数的方法。
Func有返回值,最后一个参数输出。
   实参采用Lambda表达式.Select(p=>p); where(p=>条件)
上机:理解案例,仿照做一次。
 知识点:
一:扩展方法
    1)作用:往一个已经生成的类中加方法
    2)如何加:
       1)写一个静态类  类前static
       2)写一个静态方法 
    public static 返回值类型  方法名(this 类型 变量,方法参数){
       方法功能。。。。
    }
   3)调用用 对象.方法(参数);
   注意:
   1.当类本身的方法与扩展方法同名时,优先类本身的方法
   2.如果对父类扩展方法,则子类也会有该扩展方法
   3.如果对接口扩展方法,则所有实现类均有该扩展方法。
   public interface  接口名{  方法定义 } ,实现类实现所有方法
二:var :推断类型
    var 用来修饰一个可以推断出类型的局部变量
    格式:  var 变量=表达式或值.  由右边来确定左边变量的类型.
    注意 , 不能  var aa=null;
三:匿名类的对象,不定义类,直接通过对象初始化器定义对象
    格式:  var aa=new {  Name="李四", Age=19  }
第三次课
       多表数据显示方法
       //有主外键关系,ef中的多显示,例如显示学生
            //方法一:使用导航属性
            /*
            y2Net22DBEntities context = new y2Net22DBEntities();
            this.dataGridView1.DataSource=
                context.Student.Select(p=>new {
              p.XSDZ,
              p.XSName,
              p.Grade.NJName})
                .ToList();
             */
            //主法二:使用Linq连接查询
            y2Net22DBEntities context = new y2Net22DBEntities();
            var grade1 = context.Grade;
            var students = context.Student;
            var showdata = from g in grade1
                           join b in students on g.NJId equals b.XSGrade
                           select new { g.NJName, b.XSName, b.XSSex };
            this.dataGridView1.DataSource = showdata.ToList();
    子查询写法
第四次课
Linq to sql 的ORM技术实现功能
1.模糊查询  示例 查询学生名有什么关键字
var aa= dbcontext.Student.Where(p=>p.XSName.IndexOf(key)>=0    
2.登陆条件查询  先查询,再计数,再比较
            var aa = from a in dbcontex.Admin
                     where a.UserName.Equals(name)
                            && a.UserPwd == pwd
                     select a;int count = aa.Count(); bool f = count > 0;
3.显示多表数据  如果创建了主外键关联
  方法一:使用导航属性  //查询学生,并显示出班级的名称,两表关联
        public  static IQueryable GetStudent()
        {
            var aa = from p in dbcontext.Student
                     select new {
                        p.XSName,
                        p.XSSex,
                        p.Grade.NJName //导航属性  };
            return aa;  }
  方法二:使用Linq的连接方法:用于显示两个有意义的集合之间的数据
    var gradelist = dbcontext.Grade;//1
            var studentList = dbcontext.Student;//2
            var aaaaa = from g in gradelist
                        join s in studentList
                        on g.NJId equals s.XSGrade
                        //where ...
                        select new
                        {
                            g.NJId,g.NJName, s.XSName,
                        };
  方法三:使用子查询
  注意:如果两个集合,在意义上有关联关系,没有创建关联,只能用第二个方法。
-------------------------------------------------------------------
Linq to SQL/EF取代ADO.net完成对数据库的访问,有时有些特别复杂的sql语句,
Linq to sql/EF(ORM技术)可能还是不能实现。如何做?Linq to sql/EF中集成了,方法
可以直接获取ADO.net的连接对象  执行SQL语句操作。主要两种,一个是查询,一个增删改
1。调用查询语句方法
   1)先定义一个显示出结果对应列属性的实体类(主要不是显示查询所有列)
   2)写好sql语句,可以使用参数化语句
   3)使用方法dbcontext.dataBase.ExecuteQuery<结果对应实体类>(sql).ToList()
2.调用增删改的方法
  1)写好sql语句,可以使用参数化sql语句
  2)使用方法dbcontext.ExecuteCommand(sql);