如何简化下面的LookUp命令?

时间:2018-09-28 14:50:35

标签: c# sql-server linq

我有这个:

public HierarquiaDto Selecionar(int id) {
        var query = (from p in Context.PapelContratos
                    join g in Context.GruposCargo on new { a=p.UsuarioGrupoCargo, b=p.EmpresaId }  equals new { a=g.Sigla, b=g.EmpresaId } into pg
                    from g in pg.DefaultIfEmpty()
                    where p.OrigemId == id
                    select new
                    {
                        p.PaisId,
                        p.EmpresaId,
                        p.Codigo,
                        p.Nome,
                        p.PapelId,
                        OrigemId = p.OrigemId.Value,
                        p.IsPendente,
                        p.HierarquiaPapelId,
                        p.UsuarioId,
                        p.UsuarioNome,
                        p.UsuarioGrupoCargo,
                        p.UsuarioMatricula,
                        GrupoCargoNome = g.Nome
                    });

        Context.Database.CommandTimeout = 9000;
        var lookup = query.ToLookup(
            i => new { PaisId = i.PaisId, EmpresaId = i.EmpresaId, Codigo = i.Codigo, Nome = i.Nome, OrigemId = i.OrigemId },
            v => new HierarquiaUsuarioSimplesDto { PapelId = v.PapelId, HierarquiaPapelId = v.HierarquiaPapelId, Usuario = new HierarquiaUsuarioDto { Id = v.UsuarioId, Nome = v.UsuarioNome, Matricula = v.UsuarioMatricula, GrupoCargo = v.UsuarioGrupoCargo, GrupoCargoNome = v.GrupoCargoNome } }
        );

        var item = query.FirstOrDefault();

        return new HierarquiaDto
        {
            PaisId = item.PaisId,
            EmpresaId = item.EmpresaId,
            Codigo = item.Codigo,
            Nome = item.Nome,
            OrigemId = item.OrigemId,
            IsPendente = item.IsPendente,
            Usuarios = lookup.FirstOrDefault().ToList()
        };
    }

我试图创建一个HierarchyDto类型的列表,在这个对象中我有另一个名为HierarchyUsuarioSimplesDto,在这个对象中我有另一个名为User HierarchyD,我没有做这段代码,我只是在尝试改进它。 我需要属于该PaisId,CompanyId,代码,名称和OriginId的所有用户。

1 个答案:

答案 0 :(得分:0)

ToLookup以一种非常奇怪的方式被用来模拟group ... by,所以我不太肯定这会返回相同的答案,因为它实际上取决于ToLookup如何选择要返回FirstOrDefault的成员(可能是您不应该依赖的工作方式)。似乎有一些FirstOrDefault应该是First的情况。

这是我尝试使用更普通的LINQ来获得相同的答案:

var query = from p in Context.PapelContratos
            where p.OrigemId == id
            join g in Context.GruposCargo on new { a = p.UsuarioGrupoCargo, b = p.EmpresaId } equals new { a = g.Sigla, b = g.EmpresaId } into pg
            from g in pg.DefaultIfEmpty()
            group new { p, g } by new { p.PaisId, p.EmpresaId, p.Codigo, p.Nome, p.OrigemId } into pg_g
            select new HierarquiaDto {
                PaisId = pg_g.Key.PaisId,
                EmpresaId = pg_g.Key.EmpresaId,
                Codigo = pg_g.Key.Codigo,
                Nome = pg_g.Key.Nome,
                OrigemId = pg_g.Key.OrigemId.Value,
                IsPendente = pg_g.First().p.IsPendente,
                Usuarios = pg_g.Select(pg => new HierarquiaUsuarioSimplesDto {
                    PapelId = pg.p.PapelId,
                    HierarquiaPapelId = pg.p.HierarquiaPapelId,
                    Usuario = new HierarquiaUsuarioDto {
                        Id = pg.p.UsuarioId,
                        Nome = pg.p.UsuarioNome,
                        Matricula = pg.p.UsuarioMatricula,
                        GrupoCargo = pg.p.UsuarioGrupoCargo,
                        GrupoCargoNome = pg.g.Nome
                    }
                }).ToList()   
            };

var ans = query.FirstOrDefault();