Linq技術
阿新 • • 發佈:2018-11-30
urn ade 匿名 UNC ping amd 格式 推斷 種類型 第一次課 框架技術:基本功能封裝好,程序員直接使用
分類:
數據訪問層框架(簡化數據訪問)
業務層框架
表示層框架 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);
分類:
數據訪問層框架(簡化數據訪問)
業務層框架
表示層框架 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);
Linq技術