一、直接使用C#操作資料庫的類庫ADO.NETADO.NET使用Connection對象來連接資料庫,使用Command或DataAdapter 對象來執行SQL語句,並將執行的結果返回給DataReader或DataAdapter,然後 再使用取得的DataReader或者DataAdapter對 ...
一、直接使用C#操作資料庫的類庫ADO.NET
ADO.NET使用Connection對象來連接資料庫,使用Command或DataAdapter
對象來執行SQL語句,並將執行的結果返回給DataReader或DataAdapter,然後
再使用取得的DataReader或者DataAdapter對象操作數據結果。
二、Entity Framework
Entity Framework 實體框架是微軟的一個ORM框架。是支持面向數據的軟體開
發應用程式。我們一般配合linq和lambda表達式使用。
ORM((Object Relational Mapping對象關係映射)指的是面向對象的對象模型和
關係型資料庫的數據結構之間的互相轉換。(表實體跟表之間的相互轉換)
LINQ查詢:當我們使用linq查詢時,轉到定義會調到Queryable 類, 那麼也就是
說,這個類封裝了linq所有查詢的方法,提供一組用於查詢實現 IQueryable<T>
的數據結構的 靜態方法。
IQueryable和IList一樣,是用於接收一組數據的集合, IQeurable
(IQuerable<T>)不會立即在記憶體里創建持久數據,只有遍歷它(如通過
foreach)、把它轉換成List等情況下才會向記憶體載入數據,它可以實現“延期執
行”,如果當前被載入的實體有關聯實體(associations),此關聯實體可被接下
來的訪問載入。
Ilist-繼承順序如下:
Ilist->ICollection ->IEnumerable
IEnumerable它允許開發人員定義foreach語句功能的實現並支持非泛型方法的簡
單的迭代
同樣的IQueryable也繼承自IEnumerable<T>這一泛型介面
Queryable類提供了擴展的基本查詢方法:Where,Select
select提供方法如下:
public static IQueryable<TResult> Select<TSource, TResult>(this
IQueryable<TSource> source, Expression<Func<TSource, TResult>>
selector);
where提供的方法如下:
public static IQueryable<TSource> Where<TSource>(this
IQueryable<TSource> source, Expression<Func<TSource, bool>>
predicate);
public static IQueryable<TSource> Where<TSource>(this
IQueryable<TSource> source, Expression<Func<TSource, int, bool>>
predicate);
Lambda表達式
(1)源起.net的設計者發現在使用匿名方法時,仍舊有一些多餘的字母或單詞的編碼工作
比如delegate關鍵字於是進一步簡化了匿名方法的寫法。
(2)使用
List<int> arr = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };
arr.ForEach(new Action<int>(delegate(int a) { Console.WriteLine
(a); }));
arr.ForEach(new Action<int>(a => Console.WriteLine(a)));
匿名方法的代碼如下:
delegate(int a) { Console.WriteLine(a); }
使用lambda表達式的代碼如下:
a => Console.WriteLine(a)
這裡解釋一下這個lambda表達式
<1>
a是輸入參數,編譯器可以自動推斷出它是什麼類型的,
如果沒有輸入參數,可以寫成這樣:
() => Console.WriteLine("ddd")
<2>
=>是lambda操作符
<3>
Console.WriteLine(a)是要執行的語句。
如果是多條語句的話,可以用{}包起來。
如果需要返回值的話,可以直接寫return語句
LINQ
1.查詢操作符
(1)源起
.net的設計者在類庫中定義了一系列的擴展方法
來方便用戶操作集合對象
這些擴展方法構成了LINQ的查詢操作符
(2)使用
這一系列的擴展方法,比如:
Where,Max,Select,Sum,Any,Average,All,Concat等
都是針對IEnumerable的對象進行擴展的
也就是說,只要實現了IEnumerable介面,就可以使用這些擴展方法
來看看這段代碼:
List<int> arr = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };
var result = arr.Where(a => { return a > 3; }).Sum();
Console.WriteLine(result);
Console.ReadKey();
這段代碼中,用到了兩個擴展方法。
(3)好處
上面的代碼中
arr.Where(a => { return a > 3; }).Sum();
這一句完全可以寫成如下代碼:
(from v in arr where v > 3 select v).Sum();
而且兩句代碼的執行細節是完全一樣的
大家可以看到,第二句代碼更符合語義,更容易讀懂
第二句代碼中的where,就是我們要說的查詢操作符。
(4)標準查詢操作符說明
<1>過濾
Where
用法:arr.Where(a => { return a > 3; })
說明:找到集合中滿足指定條件的元素
OfType
用法:arr.OfType<int>()
說明:根據指定類型,篩選集合中的元素
<2>投影
Select
用法:arr.Select<int, string>(a => a.ToString());
說明:將集合中的每個元素投影的新集合中。上例中:新集合是
一個IEnumerable<String>的集合
SelectMany
用法:arr.SelectMany<int, string>(a => { return new
List<string>() { "a", a.ToString() }; });
說明:將序列的每個元素投影到一個序列中,最終把所有的序列
合併
<3>還有很多查詢操作符,請翻MSDN,以後有時間我將另起一篇文
章把這些操作符寫全。
2.查詢表達式
(1)源起
上面我們已經提到,使用查詢操作符表示的擴展方法來操作集合;
雖然已經很方便了,但在可讀性和代碼的語義來考慮,仍有不足;
於是就產生了查詢表達式的寫法。
雖然這很像SQL語句,但他們卻有著本質的不同。
(2)用法
from v in arr where v > 3 select v
這就是一個非常簡單的查詢表達式
(3)說明:
先看一段偽代碼:
from [type] id in source
[join [type] id in source on expr equals expr [into
subGroup]]
[from [type] id in source | let id = expr | where condition]
[orderby ordering,ordering,ordering...]
select expr | group expr by key
[into id query]
<1>第一行的解釋:
type是可選的,
id是集合中的一項,
source是一個集合,
如果集合中的類型與type指定的類型不同則導致強制類型轉化
<2>第二行的解釋:
一個查詢表達式中可以有0個或多個join子句,
這裡的source可以是一個全新的集合,可以不等於第一句中的
source
expr可以是一個表達式
[into subGroup] subGroup是一個中間變數,
它繼承自IGrouping,代表一個分組,也就是說“一對多”里的
“多”
可以通過這個變數得到這一組包含的對象個數,以及這一組對象
的鍵
比如:
from c in db.Customers
join o in db.Orders on c.CustomerID
equals o.CustomerID into orders
select new
{
c.ContactName,
OrderCount = orders.Count()
};
<3>第三行的解釋:
一個查詢表達式中可以有1個或多個from子句
一個查詢表達式中可以有0個或多個let子句,let子句可以創建一
個臨時變數
比如:
from u in users
let number = Int32.Parse(u.Username.Substring
(u.Username.Length - 1))
where u.ID < 9 && number % 2 == 0
select u
一個查詢表達式中可以有0個或多個where子句,where子句可
以指定查詢條件
<4>第四行的解釋:
一個查詢表達式可以有0個或多個排序方式
每個排序方式以逗號分割
<5>第五行的解釋:
一個查詢表達式必須以select或者group by結束
select後跟要檢索的內容
group by 是對檢索的內容進行分組
比如:
from p in db.Products
group p by p.CategoryID into g
select new { g.Key, NumProducts = g.Count()};
<6>第六行的解釋:
最後一個into子句起到的作用是
將前面語句的結果作為後面語句操作的數據源
比如:
from p in db.Employees
select new
{
LastName = p.LastName,
TitleOfCourtesy = p.TitleOfCourtesy
} into EmployeesList
orderby EmployeesList.TitleOfCourtesy ascending
select EmployeesList;