返回首頁
當前位置: 主頁 > 網絡編程 > .Net實例教程 >

ASP.NET-LINQ

時間:2020-01-16 16:12來源:知行網www.wzliqi.com 編輯:麥田守望者

 大多數應用程序都以數據為中心,但是大多數數據存儲庫都是關系數據庫。多年來,設計人員和開發人員已經基于對象模型設計了應用程序。

這些對象負責連接到數據訪問組件-稱為數據訪問層(DAL)。這里我們要考慮三點:

  • 應用程序中所需的所有數據都不會存儲在同一源中。源可以是關系數據庫,某些業務對象,XML文件或Web服務。

  • 與從數據庫或XML文件訪問數據相比,訪問內存中對象更簡單且成本更低。

  • 訪問的數據不直接使用,而是需要進行排序,排序,分組,更改等。

因此,如果有一種工具可以使所有類型的數據訪問變得容易,并且可以用幾行代碼合并來自這些不同數據源的數據并執行標準的數據處理操作,那么它將很有幫助。

LINQ或語言集成查詢就是這樣的工具。LINQ是.Net Framework 3.5及其托管語言的擴展集,這些擴展將查詢設置為對象。它定義了通用語法和編程模型,以使用通用語言查詢不同類型的數據。

關系運算符,例如Select,Project,Join,Group,Partition,Set操作等,都在LINQ中實現,而.Net Framework 3.5中的C#和VB編譯器支持LINQ語法,使得可以使用配置的數據存儲而無需訴諸ADO.NET。

例如,使用C#中的LINQ查詢在Northwind數據庫中查詢“客戶”表,代碼將是:

var data = from c in dataContext.Customers where c.Country == "Spain" select c;

哪里:

  • 關鍵字'from'在邏輯上遍歷集合的內容。

  • 將對集合中的每個對象評估帶有“ where”關鍵字的表達式。

  • “ select”語句選擇要評估的對象以添加到返回的列表中。

  • 關鍵字“ var”用于變量聲明。由于不知道返回對象的確切類型,因此表明將動態推斷信息。

LINQ查詢可以應用于從IEnumerable <T>繼承的任何數據承載類,這里T是任何數據類型,例如List <Book>。

讓我們看一個例子來理解這個概念。該示例使用以下類:Books.cs

public class Books {    public string ID {get; set;}    public string Title { get; set; }    public decimal Price { get; set; }    public DateTime DateOfRelease { get; set; }     public static List<Books> GetBooks()    {       List<Books> list = new List<Books>();       list.Add(new Books { ID = "001",           Title = "Programming in C#",           Price = 634.76m,           DateOfRelease = Convert.ToDateTime("2010-02-05") });             list.Add(new Books { ID = "002",           Title = "Learn Java in 30 days",           Price = 250.76m,           DateOfRelease = Convert.ToDateTime("2011-08-15") });             list.Add(new Books { ID = "003",           Title = "Programming in ASP.Net 4.0",           Price = 700.00m,           DateOfRelease = Convert.ToDateTime("2011-02-05") });             list.Add(new Books { ID = "004",           Title = "VB.Net Made Easy",           Price = 500.99m,           DateOfRelease = Convert.ToDateTime("2011-12-31") });             list.Add(new Books { ID = "005",           Title = "Programming in C",           Price = 314.76m,           DateOfRelease = Convert.ToDateTime("2010-02-05") });             list.Add(new Books { ID = "006",           Title = "Programming in C++",           Price = 456.76m,           DateOfRelease = Convert.ToDateTime("2010-02-05") });             list.Add(new Books { ID = "007",           Title = "Datebase Developement",           Price = 1000.76m,           DateOfRelease = Convert.ToDateTime("2010-02-05") });                 return list;    } }

使用此類的網頁上有一個簡單的標簽控件,可顯示書籍的標題。Page_Load事件創建書籍列表,并使用LINQ查詢返回書名:

public partial class simplequery : System.Web.UI.Page {    protected void Page_Load(object sender, EventArgs e)    {       List<Books> books = Books.GetBooks();       var booktitles = from b in books select b.Title;        foreach (var title in booktitles)          lblbooks.Text += String.Format("{0} <br />", title);    } }

執行頁面后,標簽將顯示查詢結果:

LINQ結果

上面的LINQ表達式:

var booktitles =  from b in books  select b.Title;

等效于以下SQL查詢:

SELECT Title from Books

LINQ運算符

除了到目前為止使用的運算符外,還有其他幾種運算符可以實現所有查詢子句。讓我們看一些運算符和子句。

Join子句

SQL中的“ join子句”用于聯接兩個數據表,并顯示包含兩個表中的列的數據集。LINQ也能夠做到這一點。要檢查這一點,請在上一個項目中添加另一個名為Saledetails.cs的類:

public class Salesdetails {    public int sales { get; set; }    public int pages { get; set; }    public string ID {get; set;}     public static IEnumerable<Salesdetails> getsalesdetails()    {        Salesdetails[] sd =        {          new Salesdetails { ID = "001", pages=678, sales = 110000},          new Salesdetails { ID = "002", pages=789, sales = 60000},          new Salesdetails { ID = "003", pages=456, sales = 40000},          new Salesdetails { ID = "004", pages=900, sales = 80000},          new Salesdetails { ID = "005", pages=456, sales = 90000},          new Salesdetails { ID = "006", pages=870, sales = 50000},          new Salesdetails { ID = "007", pages=675, sales = 40000},       };              return sd.OfType<Salesdetails>();    } }

將代碼添加到Page_Load事件處理程序中,以使用join子句在兩個表上進行查詢:

protected void Page_Load(object sender, EventArgs e) {    IEnumerable<Books> books = Books.GetBooks();    IEnumerable<Salesdetails> sales = Salesdetails.getsalesdetails();        var booktitles = from b in books join s in sales on b.ID equals s.ID       select new { Name = b.Title, Pages = s.pages };           foreach (var title in booktitles)       lblbooks.Text += String.Format("{0} <br />", title); }

結果頁面如下所示:

LINQ結果2

Where子句

“ where子句”允許向查詢添加一些條件過濾器。例如,如果要查看頁數超過500的書籍,請將Page_Load事件處理程序更改為:

var booktitles = from b in books join s in sales on b.ID equals s.ID    where s.pages > 500 select new { Name = b.Title, Pages = s.pages };

該查詢僅返回頁面數大于500的那些行:

LINQ結果3

Orderby和Orderby降序條款

這些子句允許對查詢結果進行排序。要查詢書名,頁數和價格(按價格排序),請在Page_Load事件處理程序中編寫以下代碼:

var booktitles = from b in books join s in sales on b.ID equals s.ID    orderby b.Price select new { Name = b.Title,  Pages = s.pages, Price = b.Price};

返回的元組為:

LINQ結果4

Let子句

let子句允許定義變量并為其分配從數據值計算得出的值。例如,要從上述兩個銷售中計算總銷售,您需要計算:

TotalSale = Price of the Book * Sales

為此,請在Page_Load事件處理程序中添加以下代碼段:

let子句允許定義變量并為其分配從數據值計算得出的值。例如,要從上述兩個銷售中計算總銷售,您需要計算:

var booktitles = from b in book join s in sales on b.ID equals s.ID    let totalprofit = (b.Price * s.sales)    select new { Name = b.Title, TotalSale = totalprofit};

結果查詢頁面如下所示:

LINQ結果5

 
------分隔線----------------------------
標簽(Tag):
------分隔線----------------------------
推薦內容
  • ASP.NET-安全

    在站點中實現安全性具有以下方面: 認證 :這是確保用戶身份和真實性的過程。 ASP.NET...

  • ASP.NET-LINQ

    大多數應用程序都以數據為中心,但是大多數數據存儲庫都是關系數據庫。 多年來,設計...

  • ASP.NET-調試

    通過調試,開發人員可以逐步查看代碼的工作方式,變量的值如何更改,對象的創建和銷毀...

  • ASP.NET-錯誤處理

    ASP.NET中的錯誤處理包括三個方面: 跟蹤 -在頁面級別或應用程序級別跟蹤程序執行。 ...

  • ASP.NET-個性化

    網站設計用于用戶的反復訪問。 個性化允許站點記住用戶身份和其他信息詳細信息,并為...

  • ASP.NET-自定義控件

    ASP.NET允許用戶創建控件。 這些用戶定義的控件分為以下幾類: 用戶控件 自定義控件 ...

猜你感興趣
久久99久久99精品免视看