.NET訪問資料庫的兩種方式(C#語言)

來源:互聯網
上載者:User

標籤:customers   style   返回   var   public   不同   封裝   說明   ati   

一、直接使用C#操作資料庫的類庫ADO.NET
ADO.NET使用Connection對象來串連資料庫,使用Command或DataAdapter
對象來執行SQL語句,並將執行的結果返回給DataReader或DataAdapter,然後
再使用取得的DataReader或者DataAdapter對象操作資料結果。

二、Entity Framework
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;

 

.NET訪問資料庫的兩種方式(C#語言)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.