2014-10-16 3 views
1

Как это сделать CASE WHEN оператор в LINQ?Перевод sql-кода Когда оператор 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 

МОЙ 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, а регистр «case when then» переводится. к тройному оператору – RadioSpace

+1

Возможный дубликат [Выбрать случай в LINQ] (http://stackoverflow.com/questions/936028/linq-case-statement) – AdamBT

+0

Я обновил свой вопрос, насколько я это сделал. Мне нужна третья переменная, чтобы получить результат? –

ответ

0

Во-первых, давайте удалить CASE из вашего SQL: он может быть заменен ISNULL функции:

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:

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 на значение NULL decimal. Если вы хотите другой тип, замените это приведение соответствующим образом.

+0

В предложении where в LINQ в 'GetAllGroups.Select (x => x.Grupo_Id)' в этом случае я не могу получить 'x.Grupo_Id' или любые переменные. –

+0

@Lucas_Santos См. Изменение - я изменил условие соединения, чтобы оно соответствовало одному из вашего SQL. Получил ли SQL с 'ISNULL' тот же результат, что и у вас? – dasblinkenlight

+0

Да, результат предложения был точно таким же. Я попробую LINQ-запрос в качестве вашего обновления –