Inquiridor
Agrupamento no foreach e na view não funciona

Pergunta
-
Criei e setei uma variável para controlar o seguinte. A minha LINQ me retorna hoje 5 mil linhas. Essa variável, ela está lá para evitar que se repita a mesma coisa, tipo. Digamos que a linq me retorne 400 motivo de ID=1. Logo essa variável, eu a seto para que apenas o Motivo 1 só apareça na tela uma vez. Bem, isso funcionou. Qual o problema então? Para um único motivo, eu tenho 5 Unidade_Negocio, por exemplo. Essa UN pode se repetir várias vezes, conforme dito para o motivo. Fiz semelhante ao Motivo e não funcionou.
1) O IF que eu fiz, é printado na página.
2) Mesmo que eu tenha mais de uma UN para cada Motivo, só é mostrado uma UN e nada mais e assim para os demais níveis abaixo da UN.
3) Acho que o problema está na Controller. Abaixo a minha controller(ActionResul) e a minha View(Apenas a parte que monta a TreeView.
Controller:
public ActionResult Acao()
{
RupturaEntities db = new RupturaEntities();
var monta_arvore = db.Ruptura.Where(m => m.IDMotivo != 6)
.Select(rup=>
new MontaArvoreAcao{
IDRuptura = rup.IDRuptura,
DataRuptura = rup.DataRuptura,
IDMotivo = rup.IDMotivo,
Motivo = rup.Motivo.Motivo1,
IDOrigem = rup.IDOrigem,
CodigoPDV = rup.CodigoPDV,
UF = rup.PDV.UF,
Cidade = rup.PDV.Cidade,
CnpjDescricao= rup.PDV.Cnpj + " - " + rup.PDV.Descricao,
Codigo_Apresentacao = rup.Codigo_Apresentacao,
Unidade_Negocio = rup.Apresentacao.Unidade_Negocio,
Franquia = rup.Apresentacao.Franquia,
Familia = rup.Apresentacao.Familia,
Descricao = rup.Apresentacao.Descricao
}).ToList().Take(50).OrderBy(r => r.IDMotivo);
return View(monta_arvore.ToList());
}
A minha View:
@{
var _motivo = "";
var _un = "";
var _familia = "";
<ul>
@foreach (var item in Model)
{
if (_motivo != @item.Motivo)
{
<li item-checked='false' item-expanded='false'>
@item.Motivo
<ul>
<li item-checked='false' item-expanded='false'>
@item.Unidade_Negocio
<ul>
<li item-checked='false' item-expanded='false'>
@item.Familia
<ul>
<li item-checked='false' item-expanded='false'>
@item.Descricao
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
}
_motivo = @item.Motivo;
_un = @item.Unidade_Negocio;
_familia = @item.Familia;
}
</ul>
}
Todas as Respostas
-
Pessoal, coloquei o group by na LINQ e não funcionou. Dá erro. Tentei fazer na view e tem esse o problema de que não reconhecer alguns campos. Alem do mais fiz uns IF's para controlar e acontece o seguinte. O primeiro IF que é sobre o Motivo, funciona, ou seja, não permite a repetição do Motivo. Já os demais não funcionam e são printados na tela. Veja como ficou minha View com esses IF's.
<div id='jqxWidget'>
<div style='float: left; width:auto;'>
<div id='jqxTree' style=' float: left; margin-'>
@{
var _motivo = "";
var _un = "";
var _familia = "";
<ul>
@foreach (var item in Model)
{
if (_motivo != item.Motivo)
{
<li item-checked='false' item-expanded='false'>
@item.Motivo
<ul>
if (_un != item.Unidade_Negocio)
{
@foreach(var un in @item.Unidade_Negocio)
{
<li item-checked='false' item-expanded='false'>
@item.Unidade_Negocio
<ul>
@foreach(var fam in @item.Familia)
{
<li item-checked='false' item-expanded='false'>
@item.Familia
<ul>
<li item-checked='false' item-expanded='false'>
@item.Descricao
<ul>
<li item-checked='false' item-expanded='false'>
@item.CnpjDescricao
</li>
</ul>
</li>
</ul>
</li>
}
</ul>
</li>@*Unidade Negocio*@
}
}
</ul>
</li>
}
_motivo = @item.Motivo;
_un = @item.Unidade_Negocio;
_familia = @item.Familia;
}
</ul>
}
</div>Com GroupBy dá o seguinte arro:An exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll but was not handled in user code Additional information: 'object' não contém uma definição para 'Motivo'. Teria que colocar todos os campos da LINQ no agrupamento
-
Provavelmente o erro está ocorrendo porque o Motivo está null.
Vamos lá.
Se o Motivo = 1 tem 5 Unidade_Negocio vinculadas a ela seria algo assim na tabela correto?
IDMotivo IDUnidade 1 1 1 2 1 3 1 4 1 5
Onde sua consulta te retornaria algo com isso:
var teste = db.Motivo.Where(m=>m.IdMotivo == 1).Select(m=>m).ToList(); // Se olhar o var teste no watch irá ver que a lista de motivos conterá outra lista de Unidades se a classe for declarada como isso public Class Motivos{ public int IDMotivo {get;set;} public virtual IList<Unidades> unidades {get;set;} } // Seguindo a ideia postada ontem do relacionamento o que seria interessante você ter tabelas de relacionamento contendo apenas os ID's se relacionando, o que esta sendo mostrado no exemplo que postei a cima. // Quando efetuar sua consulta link sempre valide se ela não está igual a null antes de tomar qualquer ação.
-
Entendi Fernando, mas se eu retiro o GroupBy, eu não tenho esse problema e vem tudo(fazendo consulta sem filtros). Logo a forma de agrupar é que está dando tilt, mas não conheço outra forma de agrupamento. Colocando o groupby, e coloco um break bem no começo(nessa linha - @foreach (var item in Model)), eu pego a lista e nela visualizo o Motivo. Porem, ao dar um F10 e na próxima linha, onde está o IF(if (_motivo != @item.Motivo)), aí o erro explode. Essa é a minha realidade atual.
-
Entendi Fernando, mas se eu retiro o GroupBy, eu não tenho esse problema e vem tudo(fazendo consulta sem filtros). Logo a forma de agrupar é que está dando tilt, mas não conheço outra forma de agrupamento. Colocando o groupby, e coloco um break bem no começo(nessa linha - @foreach (var item in Model)), eu pego a lista e nela visualizo o Motivo. Porem, ao dar um F10 e na próxima linha, onde está o IF(if (_motivo != @item.Motivo)), aí o erro explode. Essa é a minha realidade atual.
@item.Motivo contem registros?
Cara muito estranho estou pensando em algo mas não me vem nada muito claro de o que pode estar acontecendo.
Na minha cabeça ainda tenho o conceito de que Motivos tinha que ser um List rs.
Vou pensar em algo.
-
O que eu não estou conseguindo fazer é exatamente isso. Veja que na LINQ eu trago todos os campos. Nenhum deles vem vazio. Eu tenho 5009 registros. Mas não consigo agrupar e nem fazer o meu foreach funcionar. Quando eu fazia por jquery eu até conseguia fazer muita coisa no jquery, mas nesse caso aqui, não funciona via jquery. Apelei para a própria view, mas me esbarro nesse problema. É eu colocar um GroupBy e o erro aparece.
-
Se motivos fosse uma List eu iria sugerir para você fazer assim:
@foreach (var motivo in Model.Motivos) { }
Motivos contem quantos registros?
- Editado Fernando Mamprin quarta-feira, 17 de setembro de 2014 18:27
-
Veja só meu post original. Está assim, não para Motivo, mas para Unidade_Negocio e etc... O Motivo está vindo carregado perfeitamente, sem repetições. O problema acontece a partir da Unidade_Negocio. Motivo só dá pau, quando eu agrupo a LINQ.
-
-
Deixa eu explicar.Na LINQ está tudo carregado, conforme modelo postado aqui.
Agora, quando eu carrego na View, é aí que acontece algumas coisas. Se eu coloco um GroupBy na LINQ, conforme exemplo postado, dá erro logo no primeiro registro, que no caso é o Motivo, mas poderia ser qualquer outro. Erro já postado aqui. A query me traz muita coisa repetida, tipo, Motivo, UN e etc... Aí declarei uma variável e dentro do foreach, ela será setada com o valor que ela estiver controlando, tipo: Vamos dizer Motivo. Ela está com valor vazio. Aí eu coloco um IF para saber se o valor da Variavel é diferente do Motivo. Caso seja(a primeira sempre é) e então carrego o Motivo. Se na próxima iteração, ela continuar igual, aí pula não repetindo o mesmo nome. Bem, como Motivo é o primeiro campo, isso está funcionando bem. Quando chego no UN, aí já não funciona. Porem, escrevendo esse post, acho que coloquei a var em lugar errado, ou seja, deveria estar no final do foreach da UN e não no foreach do Motivo, como está. Mas vou testar, mas de qualquer forma, não está funcionando os demais IF's. O primeiro funciona, mas os demais não. Isso é que está atrapalhando. Estou pesquisando na net, mas ainda não vi nada realmente que resolva meu problema com IF's aninhados dentro de uma View(CSHTML). Essa é minha dor de cabeça.