LINQ 中的条件判断(CASE WHEN 等效)
SQL 中的 CASE WHEN
在 SQL 中,CASE WHEN 可以对查询结果中的字段值进行二次判断和转换:
SELECT id, name, addtime, age,
CASE
WHEN gender = 1 THEN '男'
ELSE '女'
END AS gender
FROM student
WHERE id = 1Code language: PHP (php)
LINQ 中的等效写法
LINQ 中没有 CASE WHEN 关键字,使用 三元运算符 ?: 实现相同的条件判断逻辑。
查询语法(Query Syntax)
using (var db = new DataClasses1DataContext())
{
var q = from s in db.student
where s.id == 1
select new
{
s.id,
s.name,
s.addtime,
s.age,
gender = s.gender ? "男" : "女"
};
var stu = q.First();
}Code language: JavaScript (javascript)
方法语法(Lambda / Method Syntax)
using (var db = new DataClasses1DataContext())
{
var stu2 = db.student
.Where(m => m.id == 1)
.Select(s => new
{
s.id,
s.name,
s.addtime,
s.age,
gender = s.gender ? "男" : "女"
})
.First();
}Code language: JavaScript (javascript)
生成的 SQL
以上两种 LINQ 写法最终生成的 SQL 完全一致:
SELECT [t0].[id], [t0].[name], [t0].[addtime], [t0].[age],
(CASE
WHEN [t0].[gender] = 1 THEN '男'
ELSE '女'
END) AS [gender]
FROM [dbo].[student] AS [t0]
WHERE [t0].[id] = 1Code language: PHP (php)
多条件判断
如果需要对多个条件进行判断,可以嵌套三元运算符:
// SQL 等效:CASE WHEN age < 18 THEN '未成年' WHEN age < 60 THEN '成年' ELSE '老年'
var q = db.student.Select(s => new
{
s.name,
ageGroup = s.age < 18 ? "未成年" : (s.age < 60 ? "成年" : "老年")
});Code language: JavaScript (javascript)
生成 SQL:
SELECT [t0].[name],
(CASE
WHEN [t0].[age] < 18 THEN '未成年'
WHEN [t0].[age] < 60 THEN '成年'
ELSE '老年'
END) AS [ageGroup]
FROM [dbo].[student] AS [t0]Code language: PHP (php)
Previous: 多对多关系的实现(借助中间关系表)