zoukankan      html  css  js  c++  java
  • ef602

    1、从简单的数据库操作看ef的仓储(respostory)模式

    static void Main(string[] args)
    {
    using (SchoolDBEntities db = new SchoolDBEntities())
    {
    db.Students.Add(new Student() { StudentName = "nihao" });
    
    db.SaveChanges();
    }
    }

    domain 和 db 是怎么操作。。。

    DbSet<Student> 集合 【用于存放集合】 从名称中可以看出,是一个叫做Student Set的一个集合。。

    可以看出,是一个叫做实体的仓库。。。


    SaveChanges() 模式提交,会从两个仓储中获取添加的domain entity,然后整体性的提交数据库。。。

    执行操作之前,会开启一个transaction。。。两条insert之后, commit transction。。

    UI

    BLL

    DAL


    DBSet => Repository

    DbContext => unitofwork

    2、Linq基础

    1) 关键词

    ①基础结构

    from ? in ? select
                using (EFDemoEntities db = new EFDemoEntities())
                {
                    var query = from s in db.Student
                                select s;
                    foreach(var item in query)
                    {
                        Console.WriteLine(item.StuName);
                    }
                    Console.ReadLine();
                }

    ②where

    过滤词法

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DbFirst1
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (EFDemoEntities db = new EFDemoEntities())
                {
                    var query = from s in db.Student
                                where s.StuName != "Michael"
                                select s;
                    foreach(var item in query)
                    {
                        Console.WriteLine(item.StuName);
                    }
                    Console.ReadLine();
                }
    
                Console.WriteLine("完成动作");
                Console.ReadLine();
            }
        }
    }

    ③group词法

    常与into连用,是分组的基本框架

    下面代码将学生表中的数据按照班级id进行分组,key就是班级id

    值是该班级所有学生的集合

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DbFirst1
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (EFDemoEntities db = new EFDemoEntities())
                {
                    var query = from s in db.Student
                                group s by s.ClassInfo_Id
                                into g // g是键值对结构,其中值是1个字典
                                select g;
                    foreach(var item in query)
                    {
                        Console.WriteLine("------");
                        Console.WriteLine(item.Key); 
                        // item是IGrouping类型,需要进行转换
                        var val = item.ToList();
                        foreach(var _item in val)
                        {
                            Console.WriteLine(_item.StuName);
                        }
                    }
                    Console.ReadLine();
                }
    
                Console.WriteLine("完成动作");
                Console.ReadLine();
            }
        }
    }

    ④orderby 排序,默认升序

    ascending 升序

    descending 降序

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DbFirst1
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (EFDemoEntities db = new EFDemoEntities())
                {
                    var query = from s in db.Student
                                group s by s.ClassInfo_Id
                                into g // g是键值对结构,其中值是一个字典
                                orderby g.Key descending // 根据班级id对结果进行降序排序
                                select g;
                    foreach(var item in query)
                    {
                        Console.WriteLine("------");
                        Console.WriteLine(item.Key); 
                        // item是IGrouping类型,需要进行转换
                        var val = item.ToList();
                        foreach(var _item in val)
                        {
                            Console.WriteLine(_item.StuName);
                        }
                    }
                    Console.ReadLine();
                }
    
                Console.WriteLine("完成动作");
                Console.ReadLine();
            }
        }
    }

    ⑤join词法

    与 on equal 连用

    用来做表的关联

    ⑥let 词法

    充当临时变量

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DbFirst1
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (EFDemoEntities db = new EFDemoEntities())
                {
                    var query = from s in db.Student
                                let nameLen = s.StuName.Length
                                select new { len = nameLen, s };
                    var list = query.ToList();
                    foreach(var item in list)
                    {
                        Console.WriteLine(item.len);
                    }
                    Console.ReadLine();
                }
    
                Console.WriteLine("完成动作");
                Console.ReadLine();
            }
        }
    }

    可以看出,返回的query多了1个len字段,表示每条记录名字字符串长度 

    2)IQueryable 扩展方法

    Lambda表达式

    ①查询 Select

    var query = from s in db.Student
                                select s;
                    var _query = db.Student.Select(i => i);

    ②GroupBy

                    var query = db.Student.GroupBy(i => i.ClassInfo_Id);

    ③GroupJoin

    Group+Join

    Join 多表关联

    Group 多表关联的结果上进行分组

    班级信息表

    学生信息表

    select * from [dbo].[ClassInfo] as c
    left join Student as s
    on c.Id = s.ClassInfo_Id;

    查询结果:

    使用GroupJoin来完成(省略)

    ④where 筛选

    var query = db.Student.Where(s => s.ClassInfo_Id == 2).ToList();

    ⑤order排序

    var query = db.Student.Where(s => s.ClassInfo_Id == 2).OrderBy(i=>i.ClassInfo_Id);
                    var _query = db.Student.Where(s => s.ClassInfo_Id == 2).OrderByDescending(i => i.ClassInfo_Id);

    ⑥then 二次排序用到

    ⑦join

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DbFirst1
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (EFDemoEntities db = new EFDemoEntities())
                {
                    // a,b是两个实体
                    var query = db.ClassInfo.Join(db.Student, (ClassInfo c) => c.Id, (Student s) => s.ClassInfo_Id, (a, b) =>new
                    {
                        a,
                        b
                    });
                    Console.WriteLine(query.Count());
                    Console.Read();
                }
            }
        }
    }

    对数据库的操作的linq都在Queryable上面

  • 相关阅读:
    ArrayList实现原理及源码分析之JDK8
    红黑树原理和算法介绍
    TreeMap实现原理及源码分析之JDK8
    HashMap实现原理及源码分析之JDK8
    mysql索引的使用
    HashMap实现原理及源码分析之JDK7
    arthas Can not find tools.jar 使用报错
    idea maven 更新不到本地 手动添加的 jar
    Nodejs安装及环境配置
    安装独立版本的MAT
  • 原文地址:https://www.cnblogs.com/Tanqurey/p/12482622.html
Copyright © 2011-2022 走看看