Z
ZHANK
进阶工程

LINQ 进阶

GroupBy/Join/Zip/Aggregate、let/into 子句、IQueryable vs IEnumerable

LINQ 进阶

基础 LINQ 只有 Where/Select——进阶之后,GroupBy、Join、Aggregate 让你像写 SQL 一样处理数据。

学完本章你将: 掌握 GroupBy/Join/Zip/Aggregate、IQueryable vs IEnumerable。


GroupBy 分组

csharp
var students = new[] { ... };

var byCity = students
    .GroupBy(s => s.City)
    .Select(g => new {
        City = g.Key,
        Count = g.Count(),
        AvgScore = g.Average(s => s.Score),
    });

// 多字段分组
var byCityGrade = students.GroupBy(s => new { s.City, Grade = s.Score / 10 });

Join 连接

csharp
// 内连接
var result = from u in users
             join o in orders on u.Id equals o.UserId
             select new { u.Name, o.Amount };

// 方法链写法
var result = users.Join(orders,
    u => u.Id, o => o.UserId,
    (u, o) => new { u.Name, o.Amount });

// 分组连接(GroupJoin)
var result = users.GroupJoin(orders,
    u => u.Id, o => o.UserId,
    (u, os) => new { u.Name, Orders = os });

Aggregate 聚合

csharp
// 手写聚合逻辑
var csv = new[] { "a", "b", "c" }
    .Aggregate((acc, item) => acc + "," + item);
// "a,b,c"

// 带种子值
var sum = numbers.Aggregate(0, (acc, n) => acc + n);

// Zip —— 两个序列配对
var names = new[] { "小明", "小红" };
var scores = new[] { 92, 88 };
var pairs = names.Zip(scores, (name, score) => $"{name}:{score}");

IQueryable vs IEnumerable

csharp
// IEnumerable —— 在内存中执行(数据已加载)
// IQueryable —— 翻译成 SQL 在数据库执行(推荐)
IQueryable<User> query = db.Users.Where(u => u.Age > 18);
// SQL: SELECT * FROM Users WHERE Age > 18

// 只在需要时才执行查询(延迟执行)
var result = await query.ToListAsync();