我有这个:
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的所有用户。
答案 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();