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