`
ljl_xyf
  • 浏览: 615081 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C#3.0入门系列(LingQ)(七)-GroupBy操作

阅读更多

换一种写作风格。本节讲 groupby 操作。

在所有的Linq To Sql操作中,GroupBy是最难理解的一个。因为,这里和Sql的出入较大。而Group真的就能返回n多组。
打开 vs ,新建一工程,加入 System.Data.Linq.dll 的引用。把 northwind 数据库做个映射,添加到工程里。 创建一 Northwind 类的对象。 在这里呢,我们要做分组统计,我们要先明白什么是分组。 在我们开始设计 product 表时,我们欲留了一列叫做 CategoryID 这个字段,代表了这条记录中的产品,归属于那个类别。如图,字段的设计。


 
可以简单的举例,比如,当 CategoryID 的值为 1 时,就表示,对应的记录的产品是饮料类的。当它为 2 时,代表调味品类的。具体代表那一类,要看事先的约定。一般会专门有个表来保存这个约定。在 northwind 中,用 Categories 表来保存这个约定。下面是 catagories 表中的纪录。


 
Categories Product 表,通过 CategoryID 字段关联关系。也就是说, Product 表中, CategoryID 字段所代表的意思,保存在 Categories 表中。好了,知道分组的概念了,我们开始分类统计吧。在 Linq To Sql 的所有操作中, groupby 算是比较难理解的一个。我要友好的提醒你注意下这里的分组所用的字段哦,这个将来是要被用做继承的哦。
我们来看下面的例子。

    var q  =
        from p 
in  db.Products
        group p by p.CategoryID into g
        select g;

在这里,from p in db.Products 表示从表中将对象纪录取出来。p就是每一个产品。而后面一句,group p by p.CategoryID into g表示对p进行归类,按什么归类呢,就是要按我们设定的CategoryID这个字段。而这个归类的结果,被重新命名为g,而且是必须重新命名。一旦重新命名,p的作用域就结束了,所以,最后select时,只能select g。
那有人就要问了,不重新命名可以吗?回答,可以。那你的select语句就没有了,上面语句等同与(http://www.my400800.cn )

            var q  =  from p  in  db.Products
                    group p by p.CategoryID;

这是query表达式中,很少见的没有select语句的情况。我记忆中,好像只有此一种。我们还是按
    var q =
        from p in db.Products
        group p by p.CategoryID into g
        select g;
来讲解。因为这种更好理解。在T-Sql中,groupby只是用来做分组统计,计算平均值,最大值,求和等等,而在dlinq中的groupby,则发挥到了极值。我们用ToList()取到结果,来看看上面语句返回的结果。如图:


 
整个查询语句返回八个组,这和我们数据库的八种产品是对应的。找到最后一个group,点开+号,我们可以看到,里面有个Key和Results View字段,其中Key为8,是数据库里对应的Seafood分类,点开Results View你会惊奇的发现,所有的Seafood都在里面。我们把代码改一下,看看dlinq究竟做了什么。

            Northwind db  =   new  Northwind(ConStr);
            db.Log  =  Console.Out;
             Query #region  Query
            var q  =  from p  in  db.Products
                    group p by p.CategoryID into g
                    select g;
            
             #endregion  Query
             Verification #region  Verification
             foreach  (var gp  in  q)
             {

            }
             return ;
             #endregion  Verification
 

 单步调试该foreach段代码,foreach的目的是让dlinq加载数据。在console windows上,你可以看到如下输出。

SELECT   [ t0 ] . [ CategoryID ]   AS   [ Key ]
FROM   [ Products ]   AS   [ t0 ]
GROUP   BY   [ t0 ] . [ CategoryID ]
--  Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 2.0.20612.0

SELECT   [ t0 ] . [ ProductID ] [ t0 ] . [ ProductName ] [ t0 ] . [ SupplierID ] [ t0 ] . [ CategoryID
] [ t0 ] . [ QuantityPerUnit ] [ t0 ] . [ UnitPrice ] [ t0 ] . [ UnitsInStock ] [ t0 ] . [ UnitsOnO
rder
] [ t0 ] . [ ReorderLevel ] [ t0 ] . [ Discontinued ]
FROM   [ Products ]   AS   [ t0 ]
WHERE  (( @x1   IS   NULL AND  ( [ t0 ] . [ CategoryID ]   IS   NULL ))  OR  (( @x1   IS   NOT   NULL AND
(
[ t0 ] . [ CategoryID ]   IS   NOT   NULL AND  ( @x1   =   [ t0 ] . [ CategoryID ] ))
--  @x1: Input Int32 (Size = 0; Prec = 0; Scale = 0) [1]
--
 Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 2.0.20612.0

原来dlinq不仅仅是做了一个groupby操作呀,他还针对每个组,都去做了一个遍历呀。我们可以用下面的图来理解。


 
外面的大圈,表示全集。而这个全集被分成了若干个小的集合。每个集合就叫做g。在g集合中,包含一个系统定义的Property,叫做Key。key值实际为分类时所用字段的值。而另外一部分,是该类别中所有的product.所以,我们如果想遍历某类别中所有的纪录,要这么来做。

             var  q  =   from  p  in  db.Products
                    
group  p  by  p.CategoryID  into  g
                    
select  g;            

            foreach (
var  gp  in  q)
            {
                
if  (gp. Key   ==   7 )
                {
                    foreach (
var  p  in  gp)
                    { 
                     
// do something
                    }
                }
            }

 

  • 大小: 17 KB
  • 大小: 26.4 KB
  • 大小: 56.8 KB
  • 大小: 17.5 KB
分享到:
评论

相关推荐

    Linq简介,C#使用方法

    总体来说,Visual Studio 2008和.NET 3.5是建立在.NET2.0核心的基础之上,.NET2.0核心本身将不再变化(如果不了解.NET2.0的朋友,请参看MSDN或者一些经典的书籍),C# 3.0新语言特性在.NET2.0基础上进行了改进,这些...

    lingq-to-anki:从LingQ数据创建基于句子的Anki卡

    灵格至安基lingq-to-anki是一个简单的命令行实用程序,用于从LingQ中获取课程数据(课程文本,已保存的词汇和注释),并生成一个CSV文件,其中包含文本的每个句子以及相关的词汇和注释。要求Node.js 节点程序包管理...

    LingQ进口「LingQ Importer」-crx插件

    从网上自动导入外语内容,并与LingQ的web &移动语言学习应用程序进行研究。 LingQ Importer扩展程序允许您将YouTube和Netflix等网站的网页,文章和视频字幕自动导入LingQ,以便使用LingQ的网络和移动语言学习工具...

    LINGq Sample

    a goog sample for LingQ learner.

    LingL:lingq 的克隆以学习新语言-开源

    通过阅读您选择的任何内容来学习新语言。 这是受到其他站点/项目的启发,如开源 Lwt、闭源 lingq 等......主要站点位于 GITHUB(用于发布、问题等......):https://github.com/gustavklopp/LingL

    读取和修改xml文件

    读取其他项目中的xml文件,对其xml文件进行修改

    Visual Studio 2010 Samples

    Anders(.net的老大)最新在演示C#4.0时用到的一些demo.当然也包括一些其他的关于LINGQ的Demo。全部在VisualStudio2010 即.net4.0beta下演示。非常经典。其中有一段程序能让C#实现动态语言(类似python)的效果。

    LINQPad v4.48.01 破解版

    LINQPad 4.48.01 完美破解/激活,已经开启智能感知和智能完成功能。 Crack \ Activated version, enable autocompletion and intellisense 全网唯一可用LINQPad v4.47.02 破解版见: ...

    LINQ查询语句

    LINQ查询语句,用来查询数据库下的相应信息,基础便捷

    Python-Anki单词本助手转换生成Anki单词本

    从在线必应词典/爱词霸/youdict爬取信息生成Anki可用的单词本

    DotNET语言集成查询-LINQ简介

    本来从网上下载的一个PPT,看着内容不错,改了一下界面和字体,再次分享。上专题讲解不错的PPT

    检索 linq.js

    lingq.js 欢迎大家下载

    BookShop.sln

    关于基于Lingq开发网上书店BookShop项目

    Vocab Tracker-crx插件

    VocabTracker是受LingQ,Readlang和LWT启发的工具:它可以帮助您在任何网页上跟踪词汇。 VocabTracker是一个词汇跟踪工具,可以让您在任何页面上跟踪词汇,从而可以将任何网站用作语言学习资源。 它支持以下功能:-...

    LWT ◆ Learning with Texts:◆语言学习的多功能工具◆-开源

    课文学习(LWT)是一种用于语言学习的多功能工具,灵感来自斯蒂芬·克拉森(Stephen Krashen)的第二语言习得原理,史蒂夫·考夫曼(Steve Kaufmann)的LingQ系统,Khatzumoto的想法(AJATT =“所有时间都是日语”)...

    java里面的linq

    包含java里面的lingq查询 需引入一个第三方包 亲测可用

    Web Highlighter-crx插件

    语言:English (United States) 此扩展名将帮助您存储和突出显示短语或文本块,并在需要时添加描述。 Web higlighter是chrome的扩展程序,可帮助您突出显示单词,词组或文本块。...此扩展名受到lingq和文本学习的启发。

    Wordology-crx插件

    受Lingq和FLTR的启发,Wordology允许您为单个单词添加翻译,并通过简单的鼠标悬停显示它们。单词采用颜色编码:绿色代表已知单词,红色代表未知单词,有助于直观显示您的进度。此外,Wordology的“智能匹配”试探法...

Global site tag (gtag.js) - Google Analytics