神兵利器——使用LINQ to SQL檢索和操作資料庫

來源:互聯網
上載者:User

      自.NET 3.0開始,LINQ(Language Integrated Query,整合查詢語言)便逐漸出現在.NET開發的各個角落,它不僅提供了一種用於快速檢索結構化標記語言(如XML)的方法,而且還非常有效地被用來處理與資料庫的互動。如今,通過LINQ to SQL和LINQ to Entities,LINQ已經被擴充到用來進行資料庫訪問,用以消除從資料訪問層到資料來源層出不窮的區別。LINQ to SQL和SQL之間存在一個直接映射關係,它可以通過我們事先指定的資料庫連接自動產生資料庫實體類,而我們只需要通過LINQ語句操作這些實體物件就可以非常輕鬆地從資料庫中擷取到資料。當然,LINQ to SQL所產生的實體物件的功能遠遠不止這些,它甚至支援資料的更新和預存程序的調用,所有這些都可以通過簡單的幾行LINQ語句來完成,讓我們真正擺脫了編寫資料訪問層、資料庫實體類的工作。

      下面就讓我們來看看LINQ to SQL的神奇功能吧!

LINQ to SQL物件模型

      Visual Studio 2008整合式開發環境為我們提供了很多有用的功能來實現LINQ to SQL。為了讓讀者可以自行嘗試本文所舉的樣本,讀者可能需要在本地安裝一個SQL Server資料庫執行個體,Northwind是微軟官方提供的一個不錯的例子,如果你本地沒有安裝這個執行個體,可以去下面這個地址下載:

http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&displaylang=en

      我們在Visual Studio 2008中建立一個控制台應用程式,取名為LINQExample,然後開啟Server Explorer視窗並串連到Northwind資料庫。如果找不到Server Explorer視窗,可以通過View-Server Explorer菜單開啟。

      在Server Explorer視窗中,按右鍵Data Connection節點,選擇Add Connection,在彈出的視窗中選擇Northwind資料庫。

       在工程中添加Northwind.dbml檔案,該檔案是LINQ to SQL Classes類型的檔案。      然後將Server Explorer視窗中Northwind資料庫中的所有Table和Stored Procedures拖放到Northwind.dbml視圖視窗中。此時,在Northwind.dbml檔案中,Visual Sdutio已經自動為我們建立了資料庫實體類和映射到資料庫預存程序的靜態方法,在後面的樣本中我們可以通過LINQ語句直接使用它們。      開啟Class View視窗,在其中也可以看到自動產生的實體類和靜態方法。       是不是非常方便啊?那接下來就來看看如何通過LINQ檢索和修改資料。

使用LINQ to SQL檢索資料

      LINQ提供的文法結構與SQL比較接近,這讓我們使用起來更加容易上手。Northwind.dbml自動封裝了一個內容物件NorthwindDataContext類,其中包括了我們在Northwind資料庫中要使用的所有實體類和預存程序映射方法,同時還提供了動作表資料的方法,使用時我們不需要去關心它是如何串連資料庫並進行底層資料操作的。事實上,Northwind.dbml檔案中已經包含了這些基礎設施!使用記事本開啟Northwind.dbml,可以發現這是一個純粹的XML結構化檔案,裡麵包含了資料庫連接字串和一些資料庫實體類的映射關係,同時,Northwind.designer.cs檔案中也做了很多基礎性的工作,感興趣的讀者可以自行研究其中的代碼,或許對解決實際問題有所協助。本文在這裡不對這個檔案的具體結構作詳細的解釋。

      下面的這個例子展示了通過LINQ to SQL檢索Northwind資料庫中Customers表City等於London的資料,並在Command視窗中列印出來。

using (NorthwindDataContext context = new NorthwindDataContext())
{
    var results = from curstomers in context.Customers
                  where curstomers.City == "London"
                  orderby curstomers.CompanyName
                  select curstomers;

    foreach (var curstomers in results)
    {
        Console.WriteLine("Company is {0} and Contact is {1}",
      curstomers.CompanyName, curstomers.ContactName);
    }

    // Pause to see the output
    Console.ReadLine();
}

這個是執行結果:

使用LINQ to SQL更新資料

      LINQ to SQL不僅可以從資料庫中檢索資料,藉助於NorthwindDataContext內容物件提供的方法,我們也可以通過LINQ to SQL非常方便地將資料更新到資料庫中。下面的例子展示了將資料Insert和Update到資料庫並從資料庫中刪除資料,其中使用了LINQ中的lambda運算式用於從資料來源查詢資料(lambda運算式是LINQ查詢語句的一種簡寫形式)。

using (NorthwindDataContext context = new NorthwindDataContext())
{
    // Add a new record and verify it exists through Count
    var customer = new Customer()
    {
        CompanyName = "Drama Cafe",
        CustomerID = "DRACA",
        ContactName = "Tom Smith",
        City = "Beverly Hills",
        Address = "123 Melrose Place",
        PostalCode = "90210"
    };
    context.Customers.InsertOnSubmit(customer);
    context.SubmitChanges();
    Console.WriteLine("Number of DRACA records: {0}", context.Customers.Where(c => c.CustomerID == "DRACA").Count());

    // Modify the record and verify it is changed through Count
    customer.ContactName = "Joe Smith";
    context.SubmitChanges();
    Console.WriteLine("Number of Joe Smith records: {0}", context.Customers.Where(c => c.ContactName == "Joe Smith").Count());

    // Delete a record and verify it is removed through Count
    context.Customers.DeleteOnSubmit(customer);
    context.SubmitChanges();
    Console.WriteLine("Number of DRACA records: {0}", context.Customers.Where(c => c.CustomerID == "DRACA").Count());

    // Pause to see the output
    Console.ReadLine();
}

這個是執行結果:

使用LINQ to SQL執行預存程序

      在前面我們已經看到,Northwind.dbml在產生資料庫實體類的同時,也產生了映射資料庫預存程序的靜態方法,通過NorthwindDataContext內容物件我們可以直接在LINQ to SQL中調用這些預存程序。下面的例子展示了在LINQ to SQL中調用Ten_Expensive_Products預存程序,用於檢索Products表中單價最貴的10中商品的名稱。

using (NorthwindDataContext context = new NorthwindDataContext())
{
    // Use the ten most expensive products stored procedure
    var results = from products in context.Ten_Most_Expensive_Products()
                  select products;

    foreach (var product in results)
    {
        Console.WriteLine("Product price is {0}", product.UnitPrice);
    }

    // Pause to see the output
    Console.ReadLine();
}

這個是執行結果:

結語

      使用LINQ to SQL檢索資料庫確實可以為我們開發資料庫應用程式帶來許多的便利性,例如省去編寫資料庫實體類和資料庫訪問層的代碼,但這同時也會帶來一些問題!例如在大型應用項目中這將破壞整體項目的結構,而且難以做到應用程式層與資料訪問層的松耦合結構,另外就是涉及到複雜資料庫事務時LINQ to SQL往往難以應付,一個好的解決辦法就是將事務移至資料庫,在預存程序中解決事務問題,然後在資料訪問層統一調用預存程序,不過有些非常特殊的應用程式層需求還是會存在問題。從這個意義上來看,LINQ to SQL仍然不可能全部替代傳統意義上的資料庫訪問層,不過在一些小型應用或快速原型開發中,使用LINQ to SQL確實可以給我們省去很多麻煩。

      還有一點需要說明的是,鑒於Visual Studio可以允許我們在Server Explorer中串連除SQL之外的其它資料庫,這也就意味著我們可以通過LINQ to SQL訪問其它類型的資料庫。我們可以在工程中建立多個不同的dbml檔案,用以串連不同類型的資料庫,然後在上層使用工廠進行調用切換,就可以達到支援多資料庫應用的目的。有關這一點,讀者可以自己去嘗試。

代碼下載

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.