将 SQL CASE WHEN 语句转换为 C#

Posted

技术标签:

【中文标题】将 SQL CASE WHEN 语句转换为 C#【英文标题】:Converting SQL CASE WHEN statement into C# 【发布时间】:2012-05-25 20:55:59 【问题描述】:

我正在暑期编程实习的第一周,我的任务是使用 LINQPad 将 SQL Server 2008 语句转换为 C#。一旦我这样做并让它正常工作,我就可以将它输入到 VS 并根据需要进行调整。

问题是我正在运行 SQL 语句,我不知道如何转换。在我的 C# 类中,我们没有将 SQL 语句转换为 C#,我们只是创建了一个字符串变量,将 SQL 语句分配给变量,然后将变量分配给 OleDbCommand 对象。我的导师在长周末放了一天假,我几乎独自一人,不知道该做什么,需要一些帮助。像这样的有几十个,如果我能看到如何做一个,我就能弄清楚其余的。下面是 SQL 语句:

,[hrs].Hours] - SUM(
  CASE 
    WHEN [UnitState].[UnitStateTye] <> 'ACTIVE' 
      THEN [Allocation].[AllocatedEnergyMwh] 
    ELSE 0 
  END 
/ CAST([Unit].[NetDependableCapacity] AS FLOAT)) AS SH

我很确定这是一个类似于以下内容的 if 语句:

if [UnitState].[UnitStateType] does not equal active 
then SH equals [hrs].[Hours] minus the the sum of
  [Allocation].[AllocatedEnergyMwh] / (float)[Unit].[NetDependableCapacity].  
else 
  SH = [hrs].[Hours]

我尝试了以下代码,我认为它不会工作,但需要从某个地方开始:

var results = 

    (from v in VDimUnit     
        join vf in VFactEnergyAllocation on v.UnitKey equals vf.UnitKey
        join vd in VDimGadsEvent on vf.GadsEventKey equals vd.GadsEventKey
        join vt in VDimTime on vf.TimeKey equals vt.TimeKey 
        join vus in VDimUnitState on vf.UnitKey equals vus.UnitKey
    where vd.GadsEventEndTime.Year == 2011 && v.UnitId == "THL3"
    group vf by new vus.UnitStateType, vf.AllocatedEnergyMwh v.NetDependableCapacity,
        vt.QuarterNum into groupItem       
    select new groupItem.Key.QuarterNum, SUM1 = groupItem.Sum(x=> (float)x.AllocatedEnergyMwh /
        groupItem.Key.NetDependableCapacity)).ToArray();

var resultHours = 
    (from v in VDimTime
    group v by v.QuarterNum into groupItem
    select new Hours = groupItem.Count(), groupItem.Key).ToDictionary(x=> x.Key, x=> x.Hours);

var finalResults = 
    (from r in results
    select new SH_IF_NOT_ACTIVE = resultHours[r.QuarterNum] - r.SUM1,
        Hours = 
        SH_IF_ACTIVE = resultHours[r.QuarterNum]);

    if (SH != "ACTIVE")
     
        SH_IF_NOT_ACTIVE;
    
    else
    
        SH_IF_ACTIVE;
       

如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

+1 用于实际完成一些工作。这里似乎很少有新程序员这样做。 @Michael Todd:如果我让其他人为我做这件事,我无法学习。什么都不做不是一个选择,因为我毕业后想在这家公司工作。另外,他们不会付钱让我搞砸。 第一周总是最痛苦的。 ;) 【参考方案1】:

类似这样的:

Hours = condition ? code when true : code when false;

【讨论】:

@AD.Net:谢谢你的帮助

以上是关于将 SQL CASE WHEN 语句转换为 C#的主要内容,如果未能解决你的问题,请参考以下文章

C# 将带有 Case 语句的 SQL 查询转换为 LINQ

y下面SQL语句如何使用CASE WHEN 将以下两句合并为一句。谢谢! 当

将 SQL 值从链接数据重新编码/转换为新列:为啥 CASE WHEN 返回多个值?

SQL语句中case,when,then的用法

sql2005中的case when语句怎么用啊?请写出一个常见的例子

SQL Server判断语句(IF ELSE/CASE WHEN )