今天是MVC的課開篇鋪墊,主要講解基礎知識Linq語句、lambda表達式、匿名方法、匿名類。
使用EF(實體框架)可以及其方便地創建和修改SQL數據庫,它封裝了繁瑣的SQL代碼,通過數據庫和對象之間的映射,讓程序員可以完全按照面向對象的思路使用linq語句操縱數據庫中的數據。
首先,在這個例子里,創建ModelStudent.edmx文件,用它建立Student表,里面有Id,Name,Age三項。去掉主鍵的自動增長標識,生成SQL語句,即可創建一個貨真價實數據表!
在ModelStudent.Designer.cs當中有一個類叫ModelStudentContainer,這個類可以看做我們的數據庫,Student類則是這張表對應的類,Student對象就是表中的一行。
接下來看如何進行增刪改查操作,代碼可以拷貝下來,分段試運行。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//創建數據庫實體
ModelStudentContainer DemoDB = new ModelStudentContainer();
#region 增加數據
////創建具體實體(表中一行)
//Student stu1 = new Student()
//{
// ID = 1,
// Name = "張飛",
// Age = 20
//};
//Student stu2 = new Student()
//{
// ID = 2,
// Name = "關羽",
// Age = 21
//};
//Student stu3 = new Student()
//{
// ID = 3,
// Name = "趙雲",
// Age = 22
//};
//Student stu4 = new Student()
//{
// ID = 4,
// Name = "劉備",
// Age = 23
//};
//Student stu5 = new Student()
//{
// ID = 5,
// Name = "劉表",
// Age = 24
//};
//Student stu6 = new Student()
//{
// ID = 6,
// Name = "劉禪",
// Age = 25
//};
////將實體stu添加到數據庫實體對象中
//DemoDB.Student.AddObject(stu1);
//DemoDB.Student.AddObject(stu2);
//DemoDB.Student.AddObject(stu3);
//DemoDB.Student.AddObject(stu4);
//DemoDB.Student.AddObject(stu5);
//DemoDB.Student.AddObject(stu6);
////保存對數據庫的修改
//DemoDB.SaveChanges();
#endregion
#region 查詢1:一般查詢,查詢所有數據
//var result = from u in DemoDB.Student
// select u;
//foreach (var item in result)
//{
// Console.WriteLine("ID:{0},姓名:{1},年齡:{2}。", item.ID, item.Name, item.Age);
//}
#endregion
#region 查詢2:使用ToList防止延遲加載,拆分子查詢
////這個查詢結果可以保存到服務器內存中
//var result1 = (from u in DemoDB.Student
// where u.Age >= 22
// select u).ToList<Student>();
//var result2 = from u in result1
// where u.Name != "趙雲"
// select u;
//foreach (var item in result2)
//{
// Console.WriteLine("ID:{0},姓名:{1},年齡:{2}。", item.ID, item.Name, item.Age);
//}
#endregion
#region 查詢3:使用Where方法(lambda表達式)
////使用了Where泛型方法,要傳入一個lambda表達式
//var result = DemoDB.Student
// .Where<Student>(t => t.ID == 1);
//foreach (var item in result)
//{
// Console.WriteLine("ID:{0},姓名:{1},年齡:{2}。", item.ID, item.Name, item.Age);
//}
#endregion
#region 查詢4:Linq分頁查詢
////要跳過多少頁
//int skipPage;
////每頁兩條數據
//int countPerPage=2;
////從跳過0頁到跳過2頁(輸出第1-3頁)
//for (skipPage = 0; skipPage <= 2; skipPage++)
//{
// var result = DemoDB.Student
////分頁必須排序
// .OrderBy(t => t.ID)
////跳過指定頁數
// .Skip<Student>(skipPage * countPerPage)
////獲取條數
// .Take<Student>(countPerPage);
// Console.WriteLine("第{0}頁:", skipPage + 1);
////輸出查詢結果(該頁)
// foreach (var item in result)
// {
// Console.WriteLine("ID:{0},姓名:{1},年齡:{2}。", item.ID, item.Name, item.Age);
// }
// Console.WriteLine();
//}
#endregion
#region 查詢5:使用匿名類查詢多個字段
//var result = from p in DemoDB.Student
// where p.ID < 4
////定義一個包含了ID和Name信息的匿名類
// select new { p.ID, p.Name };
//foreach (var item in result)
//{
////這里無法輸出年齡
// Console.WriteLine("ID:{0},姓名:{1}。", item.ID, item.Name);
//}
#endregion
#region 修改1:修改1條記錄
////這里沒有寫where字句,會查詢出4條記錄
//var result = from u in DemoDB.Student
// select u;
////但是這個方法一次只能取出一條記錄
////注:First方法如果返回空值則拋異常
//var target = result.FirstOrDefault<Student>();
////所以只修改了查詢結果集中的第一條記錄
//target.Name = "司馬懿";
//DemoDB.SaveChanges();
#endregion
#region 修改2:修改多條記錄
//var result = from u in DemoDB.Student
// select u;
////使用循環方式,修改所有查詢到的記錄
//foreach (var item in result)
//{
// item.Age = 10;
//}
//DemoDB.SaveChanges();
#endregion
#region 刪除
//var result = from u in DemoDB.Student
// where u.Name == "關羽"
// select u;
////刪除所有查詢結果(這里只有一條結果)
//foreach (var item in result)
//{
// DemoDB.Student.DeleteObject(item);
//}
//DemoDB.SaveChanges();
#endregion
Console.WriteLine("執行完畢!");
Console.ReadKey();
}
}
}
