LINQ 查询语法与方法语法对照整理
LINQ 有两种写法:查询语法(像 SQL)和方法语法(链式调用)。刚学时两种写法混在一起容易乱,看别人项目里有时候用 from...where...select,有时候用 .Where().Select(),反应不过来。这篇笔记把常用操作符对照着整理一遍,方便以后查阅。
一、Where 过滤
// 查询语法
var q1 = from p in products
where p.Price > 100
select p;
// 方法语法
var q2 = products.Where(p => p.Price > 100);
二、Select 投影
// 查询语法
var q1 = from p in products
select p.Name;
// 方法语法
var q2 = products.Select(p => p.Name);
三、OrderBy 排序
// 查询语法
var q1 = from p in products
orderby p.Price descending, p.Name
select p;
// 方法语法
var q2 = products
.OrderByDescending(p => p.Price)
.ThenBy(p => p.Name);
四、GroupBy 分组
// 查询语法
var q1 = from p in products
group p by p.Category into g
select new { Category = g.Key, Items = g };
// 方法语法
var q2 = products.GroupBy(p => p.Category);
五、Join 联表
var q1 = from p in products
join c in categories on p.CategoryId equals c.Id
select new { p.Name, CategoryName = c.Name };
var q2 = products.Join(
categories,
p => p.CategoryId,
c => c.Id,
(p, c) => new { p.Name, CategoryName = c.Name });
六、First / Single / Count
这几个常用方法只有方法语法:
var first = products.First(p => p.Price > 0); var single = products.Single(p => p.Id == 1); var count = products.Count(); var max = products.Max(p => p.Price); var sum = products.Sum(p => p.Price);
其中 First 和 Single 的区别要注意:First 找到第一个就返回,找不到会抛异常;Single 要求必须只有一个,多于一个也会抛异常。日常用 FirstOrDefault 更安全。
七、自己的使用习惯
- 简单过滤、排序用方法语法,链式调用更简洁。
- 多表 Join、分组比较复杂时用查询语法,可读性更好。
- 两种写法可以互相转换,也可以混用,但一个项目里尽量保持统一。