Array
(
)

Resultado do foreach se comporta de forma não esperada

Pjava
   - 18 set 2014

Venho trabalhando em uma página, onde preciso criar um sistema de treeview com checkbox e isso está consumindo bastante tempo meu e me deixa preocupado com SLA do projeto. Na controller, lá eu tenho uma LINQ que me retorna tudo que eu preciso na página. Mas acho que a forma como está, pode estar afetando o comportamento da View, mas não tenho certeza. A Action me retorna vários vampos. Existe um atributo lá que é o IDRuptura e por causa dele, tenho vários registros iguais. Bem, aí tentei resolver na própria view o comportamento deles, ou seja, que cada nó repetisse apenas uma vez o nome. A partir daó começa o meu problema. Tentarei explicar a vocês e ver se consigo uma ajuda definitiva. Se resolver isso, a parte da tela com a treeview está resolvida. O primeiro nó é o Motivo. Da forma como eu fiz na página(view) está funcionando corretamente. Dentro do Motivo, aí eu tenho outro nó, chamado Unidade_Negocio. A partir daí começa a zica. Por exemplo, para o Motivo = "VENDEU TODO ESTOQUE" eu tenho um total de 865 registros e 3 Unidade_Negocio(DERMOCOSMETICOS, GENÉRICOS e MIP). Porem quando eu monto meu Foreach, ele só Mostra MIP uma única vez. Uma única vez está correto, mas deveria mostrar os demais também. Aí pensei que pudesse ser por falta de ordenação. Fui ordenar vários campos e me deu um erro. Eu ordenei vários campos assim: .OrderBy(r => new {r.campo1,r.campo2..}). O que eu preciso é o seguinte. Trago meu Primeiro Motivo. Quando eu clicar na setinha ao lado do checkbox(expandir) deverá 1 ou mais nós com as Unidade_Negocio. Expando cada uma das UN aí deverá aparecer todas as famílias dentro daquela UN, que pode ser 1 ou mais e assim por diante. Estpou postando, respectivamente: O Erro do OrderBy, Controller e View, nessa ordem.
Erro:
Clique na imagem para abrir em uma nova janela
Controller:
#Código

public ActionResult Acao()
        {
            RupturaEntities db = new RupturaEntities();

            var monta_arvore = db.Ruptura
                               .Where(m => m.IDMotivo != 7)

                               .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,
                                   Codigo_Unidade_Negocio = rup.Apresentacao.Codigo_Unidade_Negocio,
                                   Franquia = rup.Apresentacao.Franquia,
                                   Familia = rup.Apresentacao.Familia,
                                   Descricao = rup.Apresentacao.Descricao

                               }).ToList().OrderBy(r => new { r.IDMotivo, r.Codigo_Unidade_Negocio, r.Familia, r.Descricao });==>> ***Aqui dá erro. Se remover o new, funciona.***

            return View(monta_arvore.ToList());
        }

View:
#Código
 <div id='jqxWidget'>
        <div style='float: left; width:auto;'>
            <div id='jqxTree' style='visibility: hidden; float: left; margin-left: 20px;'>
    
                @{
                    var _motivo = "";
                    var _un = "";
                    var _familia = "";
                    var _desc = "";
                    var _apr = "";
                <ul>
                    @foreach (var item in Model)
                    {
                        if (_motivo != @item.Motivo)
                        { 
                        <li item-checked='false' item-expanded='false'>
                            @item.Motivo
                            <ul>
                                
                                @foreach(var un in @item.Unidade_Negocio)
                                {
                                    if(_un != @item.Unidade_Negocio)
                                {
                                <li item-checked='false' item-expanded='false'>
                                    @item.Unidade_Negocio
                                    <ul>
                                        
                                        @foreach(var fam in @item.Familia)
                                        { 
                                         if(_familia != @item.Familia)
                                         {
                                        <li item-checked='false' item-expanded='false'>
                                            @item.Familia
                                            <ul>
                                            @foreach(var desc in @item.Descricao)
                                             {
                                               if(_desc != @item.Descricao)
                                               {
                                                <li item-checked='false' item-expanded='false'>
                                                    @item.Descricao
                                                    <ul>
                                                        @foreach (var apr in @item.CnpjDescricao)
                                                        {
                                                        <li item-checked='false' item-expanded='false'>
                                                            @item.CnpjDescricao
                                                        </li>
                                                        }
                                                    </ul>
                                                </li>
                                                   _desc = @item.Descricao;
                                            }
                                            }
                                            </ul>
                                        </li>
                                            _familia = @item.Familia;
                                        }
                                        }
                                    </ul>
                                   
                                </li>@*Unidade Negocio*@
                                    _un = @item.Unidade_Negocio;
                                }
                                }
                            </ul>
                            
                        </li>
                    } 
                        _motivo = @item.Motivo;
                    }
                </ul>
               }
    
            </div>
    
            <div style='margin-left: 60px; float: left;'>
                <div style='margin-top: 10px;'>
                    <input id='jqxCheckBox' type="hidden">
                </div>
            </div>
    
        </div>
    </div>

Gostaria de evitar esse monte de Foreach aninhado e IF's, mas não vejo como. Qualquer ajuda é ótima. Essa não é uma pergunta ampla. Os foreach, podem tambem ser a causa da situação em que eu passo.

Joel Rodrigues
   - 18 set 2014

As propriedades dentro do new são todas de tipos primitivos?

Pjava
   - 19 set 2014

Sim, todas.