目录

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 → 给每个弟子贴个标签

一句话记忆:从弟子中筛选、排序、组合、分组、贴标签。