2014-10-16 45 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