LINQ查询探讨:一个主从报表和数据统计

开发 后端
LINQ 提供了一条更常规的途径即给 .Net Framework 添加一些可以应用于所有信息源的具有多种用途的语法查询特性,LINQ查询结果序列可以被绑定到任何ASP.NET中的数据绑定控件。

在LINQ 查询中,始终会用到对象。可以使用相同的基本编码模式来查询和转换 XML 文档、SQL 数据库、ADO.NET 数据集、.NET 集合中的数据以及对其LINQ 提供程序可用的任何其他格式的数据。

以前,我们要在某个报表中显示统计信息一般有两种方法:1通过一个SQL查询——我们可以向数据库发出一个额外的查询来为某个特定的类别计算统计信息。SQL包含一系列的聚合函数,并由GROUP BY子句指定应该根据什么数据来进行统计。2在表示层中统计已经获取的信息。

然而这两个方法都有他们的缺点:

第一种方法很明显,他增加了一次到数据库的往返,因为在获取报表信息的时候我们已经对数据库进行了一次访问,而我们要获得的统计信息可以从报表中获取。而且无法获取更加复杂的业务统计。

第二种方法则没有很好的让层次划分出来,我们更加希望表示层中仅仅使用方法而不要去设计这些方法。(尤其是一些业务规则,比如NBA中有“球员效率”这项数据,但如果不是很熟悉这项业务的程序员是不知道这个效率是如何计算的。)

既然我们使用了分层架构,就应该把这些职能分开,表示层的设计者只需要设计UI,了解方法的名称就可以了。具体的业务计算应该留下来给业务逻辑层的设计者去设计。

有了LINQ查询我们就可以把这些东西都放到业务层去了,因为数据操作已经对象化,在逻辑层中就可以方便地统计数据并且直接在表示层调用这样的方法。

按部就班的做

1我们需要一个下来列表来选择门类,所以我们需要一个门类列表,在Productbll中添加一个新的方法GetCategory代码如下:

  1. [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)]  
  2.    public IQueryable GetCategory()  
  3.    {  
  4.        var category = from p in db.Categories  
  5.                      select p;  
  6.        return category;  

2.代码很简单我就不解释了,由于我们的重点不是这个门类选择列表,所以我直接选择了全部字段,其实只要ID和Name两个字段就可以了。新建一个WEB窗体,添加一个下拉列表,在自动回送上打勾,选择新建数据源。

3.LINQ查询下数据源选择对象数据源,选择Productbll,方法选择GetCategory,点击完成。字段显示填写CategoryName,字段值填写CategoryID。

4.然后就是显示统计和从报表的方法,在GetCategory方法下添加一个新方法GetProductByCategoryID,代码如下:

  1. [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)]  
  2.    public IQueryable GetProductByCategoryID(int categoryID,out decimal? total)  
  3.    {  
  4.        total = 0;  
  5.        var product = from p in db.Products  
  6.                      where p.CategoryID == categoryID  
  7.                      select p;  
  8.        foreach (Product p in product)  
  9.            total += p.UnitPrice;  
  10.        return product;  

5.简单的代码解释:

1)这是一个包含2个输出的方法,方法本身是可以作为数据源的IQueryable类型,另外还会输出一个十进制类型数,也就是总价

2)获取CategoryID与输入参数categoryID相匹配的记录

3)遍历这些记录,获取他们的价格之和

4)返回这些记录与总价

6.在页面中添加一个GridView与一个Lable控件,双击下拉列表,进入事件,加入如下代码:

  1. decimal? sum = 0;  
  2.        GridView1.DataSource=product.GetProductByCategoryID(Convert.ToInt16(DropDownList1.SelectedValue),out sum);  
  3.        GridView1.DataBind();  
  4.        Label1.Text = "总价:"+Convert.ToString(sum); 

7.运行该页面,任意选择一个门类,观察总价和这些记录。

小结:

这章的内容并不多,需要注意的是我们使用了返回多个结果的方法,方法本身是IQueryable类型,另外还会输出一个十进制类型数,也就是总价。我们在逻辑层中利用LINQ查询结果,并且进行遍历,获得总价。在表示层中我们仅仅调用了方法,而且对数据库仅有一次操作。

比起直接用SQL获取总价来说,我们的方法少了一次数据库的往返。比起在表示层写方法,我们的方法的层次更加分明。在没有使用这样的结构以前,也可以在逻辑层这么做,只不过还需要手动的把数据转换成可以遍历的对象,而现在一切都方便了。可以直接对Product表中的记录使用for each.除此之外我们不需要做更多的工作。

本贴来自天极网群乐社区

【编辑推荐】

  1. LINQ查询的目的与实现手段
  2. LINQ查询表达式深入剖析
  3. 实例二:绑定到LINQ查询的结果
  4. LINQ——语言级集成查询入门指南
  5. LINQ的演变及其对C#设计的影响
责任编辑:林琳 来源: 天极网群乐社区
相关推荐

2009-09-10 16:22:48

LINQ建立数据报表

2015-02-12 16:05:51

微信SDK

2015-02-12 15:45:05

微信SDK

2015-02-12 16:17:09

微信SDK

2020-09-10 09:39:56

大数据大数据统计数据

2023-12-08 07:55:37

MySQL数据统计InnoDB

2015-02-12 16:53:22

微信SDK

2013-08-30 10:08:16

微信公众平台数据统计功能社交应用

2009-09-18 13:58:00

LINQ查询数据库

2016-12-16 12:43:38

大数据OLAP数据统计

2018-08-31 08:01:27

数据统计机器学习深度学习

2019-07-11 10:52:02

Python统计数据

2009-09-14 13:25:08

LINQ多方面探讨

2012-08-10 13:34:25

深信服应用交付负载均衡

2022-06-24 09:58:35

大数据JavaPython

2009-09-08 10:03:13

Linq查询Acces

2011-08-18 10:03:57

NoSQL初创公司适用

2009-06-15 17:45:20

LINQ分组统计

2011-07-20 13:40:00

SQLite数据库查询数据

2023-08-03 18:05:26

人工智能
点赞
收藏

51CTO技术栈公众号