最近参加一场面试,面试官问了我一个特别基础的问题:
“什么是 LINQ?”
明明这问题我早就背过、用过、甚至写过好几遍,可当时脑子就像断了电一样,一片空白。
最离谱的是,我脑子里蹦出来的第一个词居然是 “link”(链接)……
(后来想想,可能是因为发音太像了?)
面试完我自己都忍不住笑了,但这件事也让我意识到:有些知识点,光“知道”还不够,得真正“吃透”才行。
于是写下这篇小文,一方面帮自己巩固理解,另一方面也想给刚入 .NET 门的新手朋友们提个醒——别像我一样,在简单问题上栽跟头。
什么是 .NET 中的 LINQ?
LINQ,全名叫 Language Integrated Query(语言集成查询),是 C# 和 .NET 提供的一项强大功能。
简单说,它让你直接在 C# 代码里用类似 SQL 的方式,去查、筛、排、转各种数据,不用再为不同数据源写一堆乱七八糟的代码。
为什么 LINQ 很重要?
在 LINQ 出现之前,你想操作数据?那得看数据在哪:
数组或列表?自己写 for 循环。 数据库?得用 ADO.NET 或写原生 SQL。 XML?又是一套完全不同的 API。
每种数据源都得学一套写法,代码又长又难维护。
而 LINQ 的出现,统一了查询语法——不管是内存里的 List、数据库里的表,还是 XML 文件,你都可以用几乎一样的方式去处理。
代码更简洁、更易读,也更容易改。
一个简单的例子
假设你有一个数字列表,想把里面的偶数挑出来。
写法一:查询语法(像 SQL)
var numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
var evens = from n in numbers
where n % 2 == 0
select n;
foreach (var e in evens)
{
Console.WriteLine(e); // 输出:2, 4, 6
}
写法二:方法语法(链式调用,实际项目中更常见)
var evens = numbers.Where(n => n % 2 == 0);
我个人更喜欢方法语法——写起来顺手,组合起来也灵活,尤其适合在真实项目中快速拼接逻辑。
更多实用的 LINQ 操作
LINQ 可不只是“筛选”这么简单,它有一整套操作符,能帮你轻松搞定各种数据处理:
// 数一数有多少个元素
var count = numbers.Count(); // 6
// 判断有没有偶数
var hasEven = numbers.Any(n => n % 2 == 0); // true
// 筛出奇数
var odds = numbers.Where(n => n % 2 != 0); // 1, 3, 5
// 排序(升序 / 降序)
var ordered = numbers.OrderBy(n => n); // 1, 2, 3, 4, 5, 6
var desc = numbers.OrderByDescending(n => n); // 6, 5, 4, 3, 2, 1
// 转换每个元素(比如平方)
var squares = numbers.Select(n => n * n); // 1, 4, 9, 16, 25, 36
组合起来更强大
var result = numbers
.Where(n => n % 2 == 0) // 先筛偶数
.OrderBy(n => n) // 再排序
.Select(n => $"Even number: {n}"); // 最后格式化
foreach (var item in result)
{
Console.WriteLine(item);
// 输出:
// Even number: 2
// Even number: 4
// Even number: 6
}
是不是很清爽?几行代码就把“筛选 + 排序 + 转换”全搞定了。
LINQ 能用在哪些地方?
LINQ 不是只能操作内存里的 List,它支持多种数据源:
LINQ to Objects:操作数组、List、Dictionary 等内存集合(最常用) LINQ to Entities:通过 Entity Framework 查询数据库(比如 EF Core) LINQ to XML:读写和查询 XML 文档
也就是说,只要数据能“被遍历”,基本就能用 LINQ 处理。
附:常见 LINQ 面试题(帮你避坑!)
为了避免下次面试再“卡壳”,这里整理几个高频面试题,建议熟记:
LINQ 是什么?它的核心优势是什么?
★
答:语言集成查询,统一不同数据源的查询方式,提升代码可读性和开发效率。
查询语法和方法语法有什么区别?项目中更推荐哪种?
★
答:查询语法像 SQL,方法语法是链式调用(如
.Where().Select())。实际开发中方法语法更灵活、更常用。Where和Select的区别是什么?★
答:
Where用于筛选(过滤),Select用于投影(转换每个元素)。Any()和Count() > 0哪个性能更好?为什么?★
答:
Any()更好。它只要找到一个元素就返回 true,而Count()会遍历整个集合。LINQ 查询是立即执行还是延迟执行?
★
答:大部分是延迟执行(比如
Where、Select),只有像ToList()、Count()、First()这类才会立即执行。在 Entity Framework 中使用 LINQ 时要注意什么?
★
答:要确保 LINQ 表达式能被 EF 翻译成 SQL,避免在查询中使用无法转换的 C# 方法(比如自定义函数),否则会报错或导致性能问题。
希望这篇文章能帮你把 LINQ 真正“刻”进脑子里,下次面试时,不仅能答出来,还能讲得头头是道!
毕竟,技术不怕不会,就怕“以为自己会”。