将sql Case When语句转换为LINQ

本文关键字:转换 LINQ 语句 When sql Case | 更新日期: 2023-09-27 18:26:44

如何在LINQ中执行此CASE WHEN语句?

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();

将sql Case When语句转换为LINQ

首先,让我们从SQL中删除CASE:它可以替换为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。如果需要其他类型,请根据需要替换此强制转换。