将 SQL CASE WHEN 语句转换为 C#

本文关键字:转换 语句 WHEN SQL CASE | 更新日期: 2023-09-27 18:35:19

我正在暑期编程实习的第一周,我的任务是使用 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;
    }   

我很感激有人可以指出我正确的方向。

将 SQL CASE WHEN 语句转换为 C#

像这样:

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