LINQ to SQL中的CASE语句实现

T-SQL查询中使用CASE语句是一种常见的场景,但如何在LINQ to SQL中实现类似的功能呢?答案其实非常简单直接。正如将看到的,使用C#的"Immediate If"可以转换为T-SQL中的CASE语句。

为了演示这一过程,创建了一个名为CityWeather的表,该表包含两个字段:NameTemperature。以下是创建该表的SQL脚本:

CREATE TABLE [dbo].[CityWeather]( [Name] [nvarchar](100) NOT NULL, [Temperature] [decimal](18,0) NOT NULL ) ON [PRIMARY]

目标是让LINQTo SQL生成一个类似于以下T-SQL语句的查询:

SELECT Name, Temperature, CASE Temperature WHEN 30 THEN 'Toasted' WHEN 25 THEN 'I like it' WHEN 10 THEN 'Just perfect' WHEN -15 THEN 'Gonna freeze my' END AS 'Message' FROM CityWeather

以下是编写的LINQTo SQL查询的C#代码:

from c in CityWeathers select new { c.Name, c.Temperature, Messaage = c.Temperature == 30 ? "Toasted" : c.Temperature == 25 ? "I like it" : c.Temperature == 10 ? "Just perfect" : c.Temperature == -15 ? "Gonna freeze my" : "" }

LINQ To SQL查询生成了以下T-SQL查询:

SELECT [t0].[Name], [t0].[Temperature], ( CASE WHEN [t0].[Temperature] = @p0 THEN CONVERT(NVarChar(15), @p1) WHEN [t0].[Temperature] = @p2 THEN CONVERT(NVarChar(15), @p3) WHEN [t0].[Temperature] = @p4 THEN CONVERT(NVarChar(15), @p5) WHEN [t0].[Temperature] = @p6 THEN @p7 ELSE CONVERT(NVarChar(15), @p8) END ) AS [Messaage] FROM [CityWeather] AS [t0]

在这个例子中,可以看到C#中的三元运算符(?:)是如何被转换为T-SQL中的CASE语句的。每个条件分支都被映射到一个CASE子句,而相应的值则作为结果返回。

这种映射不仅使得代码更加清晰,而且也提高了查询的可读性和维护性。通过这种方式,可以在LINQto SQL中灵活地实现复杂的逻辑判断,而不需要直接编写复杂的SQL语句。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485