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

上面的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 LINQ

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 LINQ

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 LINQ

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 LINQ

  

拾荒的老头

关于作者: 拾荒的老头

为您推荐