LINQ 中的条件判断(CASE WHEN )

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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注