ASP.Net教程

ASP.NET LINQ

大多数应用程序都以数据为中心,但大多数数据存储库是关系数据库。多年来,设计人员和开发人员一直在设计基于对象模型的应用程序。
对象负责连接到数据访问组件-称为数据访问层 (DAL)。这里我们需要考虑三点:
应用程序中所需的所有数据并非存储在同一个源中。源可以是关系数据库、某些业务对象、XML 文件或网络服务。 访问内存中的对象比访问数据库或 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 是任何数据类型,例如 List
让我们看一个例子来理解这个概念。该示例使用以下类: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 Result4

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 Result5
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4