快速业务通道

LINQ体验(7)-LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21

我们继续讲解LINQ to SQL语句,这篇我们来讨论Group By/Having操作符和 Exists/In/Any/All/Contains操作符。

Group By/Having操作符

适用 场景:分组数据,为我们查找数据缩小范围。

说明:分配并返回对传入 参数进行分组操作后的可枚举对象。分组;延迟

1.简单形式:

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

语句描述:使用Group By 按CategoryID划分产品。

说明:from p in db.Products 表示从表中将 产品对象取出来。group p by p.CategoryID into g表示对p按CategoryID字段 归类。其结果命名为g,一旦重新命名,p的作用域就结束了,所以,最后select 时,只能select g。当然,也不必重新命名可以这样写:

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

我们用示意图表示:

LINQ体验(7)-LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains

如果想遍历某类别中所有记录,这样:

foreach (var gp in q)
{
  if (gp.Key == 2)
  {
     foreach (var item in gp)
    {
      //do something
    }
  }
}
2.Select匿名类:

var q =
  from p in db.Products
  group p by p.CategoryID into g
  select new { CategoryID = g.Key, g };

说明:在这句LINQ语句中,有2个property:CategoryID和g。这个 匿名类,其实质是对返回结果集重新进行了包装。把g的property封装成一个完 整的分组。如下图所示:

LINQ体验(7)-LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains

如果想遍历某匿名类中所有记录,要这么做:

foreach (var gp in q)
{
  if (gp.CategoryID == 2)
  {
    foreach (var item in gp.g)
    {
       //do something
    }
  }
}
3.最大值

var q =
  from p in db.Products
  group p by p.CategoryID into g
  select new {
    g.Key,
     MaxPrice = g.Max(p => p.UnitPrice)
  };

语句 描述:使用Group By和Max查找每个CategoryID的最高单价。

说明:先按 CategoryID归类,判断各个分类产品中单价最大的Products。取出CategoryID值 ,并把UnitPrice值赋给MaxPrice。

4.最小值

var q =
   from p in db.Products
  group p by p.CategoryID into g
  select new {
    g.Key,
    MinPrice = g.Min(p => p.UnitPrice)
  };

语句描述:使用Group By和Min查 找每个CategoryID的最低单价。

说明:先按CategoryID归类,判断各个 分类产品中单价最小的Products。取出CategoryID值,并把UnitPrice值赋给 MinPrice。

5.平均值

var q =
  from p in db.Products
  group p by p.CategoryID into g
  select new {
    g.Key,
    AveragePrice = g.Average(p => p.UnitPrice)
  };

语句描述:使用Group By和 Average得到每个CategoryID的平均单价。

说明:先按CategoryID归类, 取出CategoryID值和各个分类产品中单价的平均值。

6.求和

var q =
  from p in db.Products
  group p by p.CategoryID into g
  select new {
    g.Key,
     TotalPrice = g.Sum(p => p.UnitPrice)
  };

语 句描述:使用Group By和Sum得到每个CategoryID 的单价总计。

说明: 先按CategoryID归类,取出CategoryID值和各个分类产品中单价的总和。

7.计数

var q =
  from p in db.Products
   group p by p.CategoryID into g
  select new {
     g.Key,
    NumProducts = g.Count()
  };

语句 描述:使用Group By和Count得到每个CategoryID中产品的数量。

说明: 先按CategoryID归类,取出CategoryID值和各个分类产品的数量。

8.带 条件计数

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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号