ASP.NET基础 专题
您的位置:csharp > ASP.NET基础专题 > ASP.NET LINQ
ASP.NET LINQ
作者:--    发布时间:2019-11-20

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

这些对象负责连接到数据访问组件(称为数据访问层(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);
    }
}

当页面执行时,标签显示查询的结果:

上面的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);
    }
}

结果页面如图所示:

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

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};

返回的元组是:

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 };

结果查询页面如下所示:


网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册