分组后使用 into 保存分组结果

group by ... into g 把分组后的整个结果集存入变量 g,后续可以:

  • 通过 g.Key 访问分组键
  • 通过 g.Count()g.Sum() 等聚合方法统计每组数据
  • 通过 where 对分组结果进行过滤(等效 SQL 的 HAVING

内存集合示例

string[] words = { "apples", "blueberries", "oranges", "bananas", "apricots" };

var q = from w in words
        group w by w[0] into fruitGroup        // 按首字母分组
        where fruitGroup.Count() >= 2           // 只保留数量 >= 2 的组
        select new 
        { 
            FirstLetter = fruitGroup.Key, 
            Words = fruitGroup.Count() 
        };

var list = q.ToList();Code language: JavaScript (javascript)

结果:

FirstLetterWords
a2(applesapricots
b2(blueberriesbananas

数据库查询示例

using (var db = new DataClasses1DataContext())
{
    var q = from m in db.Money
            group m by m.name into g          // 按名字分组,每组存入 g
            select new 
            { 
                name = g.Key,                 // 分组键(name 值)
                count = g.Count()             // 每组记录数
            };

    var list = q.ToList();
}Code language: JavaScript (javascript)

生成的 SQL:

SELECT COUNT(*) AS [count], [t0].[name]
FROM [dbo].[Money] AS [t0]
GROUP BY [t0].[name]Code language: CSS (css)

into 后的常用操作

操作写法等效 SQL
计数g.Count()COUNT(*)
求和g.Sum(m => m.je)SUM(je)
平均值g.Average(m => m.je)AVG(je)
最大值g.Max(m => m.je)MAX(je)
最小值g.Min(m => m.je)MIN(je)
过滤分组where g.Count() >= 2HAVING COUNT(*) >= 2

into + where 等效 HAVING

var q = from m in db.Money
        group m by m.name into g
        where g.Sum(m => m.je) > 1000        // 只保留总金额 > 1000 的组
        select new
        {
            name = g.Key,
            total = g.Sum(m => m.je)
        };Code language: JavaScript (javascript)

where 写在 group by ... into g 之后,翻译为 SQL 的 HAVING 子句,在数据库端过滤分组结果。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注