none
Agrupamento no foreach e na view não funciona RRS feed

  • 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>
                   }
    terça-feira, 16 de setembro de 2014 19:40

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 

    quarta-feira, 17 de setembro de 2014 14:15
  • 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.

    quarta-feira, 17 de setembro de 2014 14:34
  • 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.
    quarta-feira, 17 de setembro de 2014 16:42
  • 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.

    quarta-feira, 17 de setembro de 2014 18:12
  • 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.
    quarta-feira, 17 de setembro de 2014 18:16

  • Se motivos fosse uma List eu iria sugerir para você fazer assim:

    @foreach (var motivo in Model.Motivos)
    {
    }

    Motivos contem quantos registros?




    quarta-feira, 17 de setembro de 2014 18:24
  • 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.
    quarta-feira, 17 de setembro de 2014 18:56
  • Desculpe eu confundi falei Motivo querendo dizer Unidade_Negocio. 

    Ele vem preenchido corretamente com o groupBy? 

    Ele Passa por todas as fazes(registros) até ocasionar o erro?

    quarta-feira, 17 de setembro de 2014 19:00
  • 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.

    quarta-feira, 17 de setembro de 2014 19:52