ASP.NET LINQ

大多數應用程序是以數據爲中心的,但大多數數據存儲庫都是關係數據庫。多年來,設計人員和開發人員基於對象模型設計了應用程序。

這些對象負責連接到數據訪問組件(稱爲數據訪問層(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。

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

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

其中,

  • from關鍵字在邏輯上循環了集合的內容。
  • 針對集合中的每個對象評估計算帶有where關鍵字的表達式。
  • select語句選擇評估對象添加到正在返回的列表中。
  • var關鍵字用於變量聲明。由於返回的對象的確切類型是未知的,這表明信息將被動態推斷。

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

下面來看看一個例子來理解這個概念。打開Visual Studio 創建一個ASP.NET空網站項目:LinqDemo ,添加一個Web窗體頁面文件:Default.aspx -

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>LinQ示例</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <h4>圖書列表示例</h4>
            <asp:Label ID="lblbooks" runat="server"></asp:Label>
        </div>
    </form>
</body>
</html>

該示例使用以下類:Books.cs -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Books 的摘要說明
/// </summary>
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查詢返回標題:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : 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);
    }
}

當頁面執行時,標籤顯示查詢的結果:

ASP.NET

上面的LINQ表達式:

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

它相當於下面的SQL查詢:

SELECT Title from Books

LINQ運算符

除了迄今使用的操作符外,還有其他幾個操作符,它們實現了所有的查詢語句。下面來看看一些運算符和子句。

Join子句

SQL中的「Join子句」 用於連接兩個數據表,並顯示包含兩個表的列的數據集。LINQ也有這個能力。要理解這個用法,現在添加另一個名爲 Saledetails.cs 的類:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

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子句在兩個表上進行查詢:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Sales : System.Web.UI.Page
{
    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);
    }
}

結果頁面如圖所示:

ASP.NET

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的那些行:

ASP.NET

Orderby和Orderbydescending子句

這些子句允許對查詢結果進行排序。要按照價格查詢書籍的標題,頁數和價格,請在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};

返回的元組是:

ASP.NET

Let子句

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

TotalSale = Price of the Book * Sales

要實現這一點,請在Page_Load事件處理程序中添加以下代碼片段:

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

結果查詢頁面如下所示:

ASP.NET

易百教程移動端:請掃描本頁面底部(右側)二維碼並關注微信公衆號,回覆:"教程" 選擇相關教程閱讀或直接訪問:http://m.yiibai.com

上一篇:ASP.NET調試 下一篇:哥,這回真沒有了

加QQ羣啦,易百教程官方技術學習羣

QQ羣名稱

羣號

人數

免費

等級

羣介紹

JAVA技術

227270512

2000

LV5

Java基礎,JSP(Servlet),JAVA框架,Java高併發架構,Maven等等

MySQL/SQL

418407075

2000

LV5

SQL基礎,MySQL基礎,MySQL存儲過程,視圖,觸發器等等

大數據開發

655154550

2000

LV5

Spark,zookeeper,kafka,CDH,hive,fulme,hbase等Hadoop雲計算生態圈技術

Python技術

287904175

2000

LV5

Python編程,Python Web,Python大數據,Python爬蟲,自然語言處理等

Linux技術

479429477

2000

LV1

Redhat/Centos,Ubuntu,Shell,運維,監控等技術

PHP/Web開發者

460153241

1000

LV0

PHP基礎,PHP高級,網站優化/架構,JS,HTML,JQuery,前端等Web開發技術

人工智能

456236082

1000

LV0

人工智能,深度學習,算法等技術

Oracle數據庫

175248146

1000

LV0

SQL基礎,Oracle基礎,Oracle存儲過程,視圖,觸發器等等

Android開發

159629185

1000

LV0

Android開發,Android Studio,Kotlin,Dagger等技術

微軟技術

579821706

1000

LV0

C#,ASP.Net,VB.Net,ADO.Net,SQL Server,VBA,Excel等技術