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上面

 

posted on 2020-03-12 20:49  Tanqurey  阅读(112)  评论(0编辑  收藏  举报