2014-10-16 73 views
1

我怎样才能在LINQ中做这个CASE WHEN声明?翻译一个sql case当声明到LINQ

SELECT c.nm_grupo, c.cd_grupo, YEAR(GETDATE()), 
    CASE WHEN (
       SELECT SUM(p.valor) 
       FROM ind_receita p 
       JOIN ind_equipto o ON p.cd_equipto = o.cd_equipto 
       JOIN ind_grupo c2 ON o.cd_grupo = c2.cd_grupo 
       WHERE c2.cd_grupo = c.cd_grupo 
       AND YEAR(p.dt_emissao) = YEAR(GETDATE()) 
      ) 
       IS NULL THEN 0 ELSE 
       (
       SELECT SUM(p.valor) 
       FROM ind_receita p 
       JOIN ind_equipto o ON p.cd_equipto = o.cd_equipto 
       JOIN ind_grupo c2 ON o.cd_grupo = c2.cd_grupo 
       WHERE c2.cd_grupo = c.cd_grupo 
       AND YEAR(p.dt_emissao) = YEAR(GETDATE()) 
      ) 
     END AS valor 
FROM ind_grupo c 
ORDER BY c.nm_grupo 

MY TRY

 // SELECT * FROM IND_GRUPO IN LINQ 
     var GetAllGroups = (from c in _repositorio.GetGrupoEquipamentos() 
          select c); 

     // THE SAME SUBQUERY IN LINQ 
     var MySubQuery= (from p in _repositorio.GetReceitas() 
        join o in _repositorio.GetEquipamentos() on p.CodigoEquipamento.Equipamento_Id equals o.Equipamento_Id 
        join a in _repositorio.GetGrupoEquipamentos() on o.CodigoGrupo.Grupo_Id equals a.Grupo_Id 
        where p.DataHoraCriacaoRegistro.Year == DateTime.Now.Year 
        && a.Grupo_Id == GetAllGroups.Select(a => a.Grupo_Id) 
        select p.Valor).Sum(); 
+0

您的选择语句转换为LINQ语句和'when when then'翻译。到一个三元运算符 – RadioSpace 2014-10-16 18:22:11

+1

可能的重复[在LINQ中选择案例](http://stackoverflow.com/questions/936028/linq-case-statement) – AdamBT 2014-10-16 18:25:26

+0

我更新了我的问题,我做了多少。我需要第三个变量来获得结果? – 2014-10-16 18:31:09

回答

0

首先,让我们从你的SQL删除CASE

SELECT 
    c.nm_grupo 
, c.cd_grupo 
, YEAR(GETDATE()) 
, ISNULL((
     SELECT SUM(p.valor) 
     FROM ind_receita p 
     JOIN ind_equipto o ON p.cd_equipto = o.cd_equipto 
     JOIN ind_grupo c2 ON o.cd_grupo = c2.cd_grupo 
     WHERE c2.cd_grupo = c.cd_grupo 
     AND YEAR(p.dt_emissao) = YEAR(GETDATE()) 
     ) 
    , 0) AS valor 
FROM ind_grupo c 
ORDER BY c.nm_grupo 

现在让我们将此转换为LINQ:它可以通过ISNULL功能所取代:

var GetAllGroups = _repositorio 
    .GetGrupoEquipamentos() 
    .Select(c => new { 
     c.nm_grupo // Use C# fields that you mapped to these fields in DB 
    , c.cd_grupo // Same as above 
    , valor = (from p in _repositorio.GetReceitas() 
       join o in _repositorio.GetEquipamentos() on p.CodigoEquipamento.Equipamento_Id equals o.Equipamento_Id 
       join a in _repositorio.GetGrupoEquipamentos() on o.CodigoGrupo.Grupo_Id equals a.Grupo_Id 
       where c.Grupo_Id == a.Grupo_Id && p.DataHoraCriacaoRegistro.Year == DateTime.Now.Year 
       select (decimal?)p.Valor).Sum() ?? 0 
    }); 

注意p.Valor的演员阵容为可空decimal。如果您需要其他类型,请根据需要替换此类型。

+0

在LINQ的where子句中,在这种情况下'GetAllGroups.Select(x => x.Grupo_Id)'中我无法获得'x.Grupo_Id'或任何变量。 – 2014-10-17 19:48:25

+0

@Lucas_Santos请参阅编辑 - 我更改了连接条件以匹配SQL中的连接条件。使用'ISNULL'产生的SQL与您拥有的结果相同吗? – dasblinkenlight 2014-10-17 19:55:25

+0

是的,这个句子的结果是完全一样的。我将尝试LINQ查询作为您的更新 – 2014-10-17 20:57:14