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();