LINQ to Objects 查询与方法链
目录
LINQ to Objects 查询与方法链
① 查询语法(Query Syntax)
这是 LINQ 的 SQL 风格写法:
var result = from s in students // 从弟子集合里
where s.Score > 80 // 筛选
orderby s.Score descending // 排序
select new { s.Name, s.Score }; // 投影from→ 相当于 foreach / 遍历where→ 筛选orderby→ 排序select→ 投影 / 改形状
武侠比喻:
从弟子队伍里挑出悟性 > 80 的弟子,按武力从高到低排列,然后只显示名字和武力。
② 方法链写法(Method Syntax / Fluent)
同样逻辑,用链式方法:
var result = students
.Where(s => s.Score > 80)
.OrderByDescending(s => s.Score)
.Select(s => new { s.Name, s.Score });特点:
- 灵活,可嵌套、组合
- 链式写法更适合函数式思维
- Query syntax 可以直接转换成方法链,反之亦然
口诀:
Where → 筛选
OrderBy → 排序
Select → 投影
③ Let 子句(中间变量)
查询语法特有,方法链没有直接对应。
var result = from s in students
let isAdult = s.Age >= 18
where isAdult
select new { s.Name, s.Age };let= 定义中间变量- 武侠比喻:你给每个弟子贴一个“成年标签”,再筛选成年弟子
④ Join(内连接)
查询语法:
var result = from s in students
join c in classes on s.ClassId equals c.Id
select new { s.Name, c.ClassName };方法链写法:
var result = students.Join(classes,
s => s.ClassId,
c => c.Id,
(s, c) => new { s.Name, c.ClassName });- 武侠比喻:把弟子和门派组合在一起,得到“谁属于哪个门派”
- Query syntax 更直观,方法链写法显得略繁琐
⑤ Group / GroupInto(分组)
查询语法:
var result = from s in students
group s by s.ClassId into g
select new { ClassId = g.Key, Count = g.Count() };方法链写法:
var result = students.GroupBy(s => s.ClassId)
.Select(g => new { ClassId = g.Key, Count = g.Count() });武侠比喻:按门派把弟子分组,然后统计每个门派人数
⑥ 区别和记忆法
方面查询语法方法链语法可读性类 SQL,更像文字描述函数式风格,更灵活Join / Group语法直观链式略复杂Let支持无直接对应,需要 Select + 临时变量调试更容易阅读调试 lambda 时有点绕
口诀:
Query = “文字风格,像 SQL”,
Method = “链式风格,像武功套路”,
功能完全等价,互可转换。
总结武侠理解
from→ 每个弟子where→ 挑选符合条件的人orderby→ 排座次select→ 换装 / 投影join→ 组合门派group by→ 分门派let→ 给每个弟子贴个标签
一句话记忆:从弟子中筛选、排序、组合、分组、贴标签。