返回首页
当前位置: 主页 > 互联网技术 > 网络安全 >

ASP.NET-LINQ

时间:2020-04-24 14:58来源:电脑教程学习网 www.etwiki.cn 编辑:小山哥

大多数应用程序都以数据为中心,但是大多数数据存储库都是关系数据库。多年来,设计人员和开发人员已经基于对象模型设计了应用程序。

这些对象负责连接到数据访问组件-称为数据访问层(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允许用户创建控件。 这些用户定义的控件分为: 用户控件 自定义控件 用户控件 ...

猜你感兴趣