代码改变世界

Linq使用Group By经验总结

2013-04-12 11:11  Andy Ge  阅读(283)  评论(0编辑  收藏  举报
1.计数
var q =  from p in db.Products  group p by p.CategoryID into g  select new {  g.Key,  NumProducts = g.Count()  }; 
语句描画:Linq运用Group By和Count失掉每个CategoryID中产物的数目。
说明:先按CategoryID归类,取出CategoryID值和各个分类产物的数目。
 
2.带请求计数
var q =  from p in db.Products  group p by p.CategoryID into g  select new {  g.Key,  NumProducts = g.Count(p => p.Discontinued)  }; 
语句描画:Linq运用Group By和Count失掉每个CategoryID中缀货产物的数目。
说明:先按CategoryID归类,取出CategoryID值和各个分类产物的断货数目。 Count函数里,运用了Lambda表达式,Lambda表达式中的p,代表这个组里的一个元素或对象,即某一个产物。
 
3.Where约束
var q =  from p in db.Products  group p by p.CategoryID into g  where g.Count() >= 10  select new {  g.Key,  ProductCount = g.Count()  }; 
语句描画:依据产物的―ID分组,查询产物数目大于10的ID和产物数目。这个示例在Group By子句后运用Where子句查找全部至少有10种产物的类别。
说明:在翻译成SQL语句时,在最外层嵌套了Where请求。
 
4.多列(Multiple Columns)
var categories =  from p in db.Products  group p by new  {  p.CategoryID,  p.SupplierID  }  into g  select new  {  g.Key,  g  }; 
语句描画:Linq运用Group By按CategoryID和SupplierID将产物分组。
说明:既按产物的分类,又按供应商分类。在by后面,new出来一个匿名类。这里,Key实践上质是一个类的对象,Key包括两个Property:CategoryID、SupplierID。用g.Key.CategoryID可以遍历CategoryID的值。
 
5.表达式(Expression)
var categories =  from p in db.Products  group p by new { Criterion = p.UnitPrice > 10 } into g  select g; 
语句描画:Linq运用Group By前往两个产物序列。第一个序列包括单价大于10的产物。第二个序列包括单价小于或等于10的产物。
说明:按产物单价可否大于10分类。其结果分为两类,大于的是一类,小于及等于为另一类。

6.定义归组对象
var categories = from p in db.Products group new {Id=p.Id,Name=p.Name} by p.Id into g select g;
语句描画:Linq按照新定义的匿名类型重组归组后每个元素的结构。
说明:按照产品的Id进行归组,但在每组的具体元素中仅包含新定义类型的元素。
该语句可以替换成:
var categories = from p in db.Products group p by p.Id into g select new {Id=p.Id,Name=p.Name};