Array
(
)

Novamente problema com jquery, ajax e bd

Pjava
   - 27 fev 2014

Fiz um join com duas tabelas para popular um menu em uma pagina web. Bem, na tabela mãe eu possuo registros únicos e na filha, claro tenho vários registros para um nregistro da mãe. Até aí beleza. Quando eu trago no join, digamos 12 registros(minha realidade atual), que equivalem a x registros para cada um na mãe. Isso está correto. Bem, o que passa é na função jquery, eu não estou conseguindo popular o campo mãe(título do menu), devido a essa situação no retorno da função, pois ela traz vários registros e eu só preciso de um. Bem não sei se é isso. Veja a query e minha jquery.
#Código

[HttpPost]
        public JsonResult MontaMenuInferior()
        {
            AgaxturCmsEntities db = new AgaxturCmsEntities();
            try
            {
                var resultado =
                    (from c in db.TB_MENUSUPERIOR_CATEGORIAS
                     join s in db.TB_MENUSUPERIOR_SUBCATEGORIAS on c.id equals (s.Id_Categoria)
                     where c.Ativo == 1 && s.Ativo == 1 && s.CdCliente == 1
                     select new
                     {
                         c.id
                         ,c.Categoria
                         ,s.Id_Categoria
                         ,s.SubCategoria
                     }).ToList();

                return Json(new { resultado }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new { resultado = ex.Message }, JsonRequestBehavior.AllowGet);
            }
        }

Agora minha jquery e o html que vai ser populado.
#Código
function MontaMenuInferior() {

            $.ajax({
                url: '/Home/MontaMenuInferior',
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                type: "POST",
                success: function (data) {
                   
                    $(data.resultado).each(function () {

                        alert(this.id);

                        if (this.Id == 2) {
                            $("#americasul").append('<li><a href="#" title="' + this.Categoria + '" alt="" >' + this.Categoria + '</a></li>');
                            if (this.Id_Categoria == this.Id) {
                                $("#americasul").append('<li><a href="#" title="' + this.SubCategoria + '" alt="" >' + this.SubCategoria + '</a></li>');
                            }
                        }

                        if (this.Id == 6) {
                            alert(this.Id);
                            $("#brasil").append('<li><a href="#" title="' + this.Categoria + '" alt="" >' + this.Categoria + '</a></li>');
                            if (this.Id_Categoria == this.Id) {
                                $("#brasil").append('<li><a href="#" title="' + this.SubCategoria + '" alt="" >' + this.SubCategoria + '</a></li>');
                            }
                        }
                    });
                },
                error: function (error) {

                }
            });
        }

Meu html
#Código
<ul class="grid_4" id="brasil">
                          
                        </ul>
                        <ul class="grid_4" id="americasul">
                            
                        </ul>

Pjava
   - 27 fev 2014

Tentei fazendo uma subquery, porem estou com um problema. Preciso retornar na sub, todos os elementos equivalentes na tabela principal. Se eu coloco um ToList() no final da subquery, não retorna nada. Coloquei um FirstOrDefault, retornou certo, mas apenas um registro(o primeiro, claro). Como eu faço para resolver isso? Abaixo minha linq com subquery.

#Código

[HttpPost]
        public JsonResult MontaMenuInferior()
        {
            AgaxturCmsEntities db = new AgaxturCmsEntities();
            try
            {
                var resultado =
                    (from c in db.TB_MENUSUPERIOR_CATEGORIAS
                     //join s in db.TB_MENUSUPERIOR_SUBCATEGORIAS on c.id equals (s.Id_Categoria)
                     where c.Ativo == 1 
                     select new
                     {
                         c.id
                         ,c.Categoria
                         ,sub = (from s in db.TB_MENUSUPERIOR_SUBCATEGORIAS where s.Id_Categoria == c.id
                                 && s.Ativo == 1 && s.CdCliente == 1
                                    select new { s.Id_Categoria, s.SubCategoria }) ==>> NESSE PONTO NÃO SEI O QUE COLOCAR
                     }).ToList();

                return Json(new { resultado }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new { resultado = ex.Message }, JsonRequestBehavior.AllowGet);
            }
        } 

Murilo Teixeira
   - 27 fev 2014

Ficou meio confuso mas vou dar uma sugestão:

Você tem: MÃE => N FILHOS;

Então MÃE tem uma Lista de FILHOS.

#Código

        public class TB_MENUSUPERIOR_SUBCATEGORIAS
        {
             public int Id_Categoria { get; set; }
             public int Ativo { get; set; }
             public int CdCliente  { get; set; }
        }

        public class TB_MENUSUPERIOR_CATEGORIAS
        {
            public List<TB_MENUSUPERIOR_SUBCATEGORIAS> ListaFilho { get; set; }
            public int id { get; set; }
            public string Categoria { get; set; }
            public int Ativo { get; set; }
        }

        public void Carregar()
        {
            var listaMae = from c in db.TB_MENUSUPERIOR_CATEGORIAS
                     where c.Ativo == 1
                     select new
                     {
                         c.id,
                         c.Categoria,
                     }.ToList();

            foreach (var mae in listaMae)
            {
                mae.ListaFilho = from s in db.TB_MENUSUPERIOR_SUBCATEGORIAS
                     where mae.id = s.Id_Categoria && s.Ativo == 1 && s.CdCliente == 1
                     select new
                     {
                         s.Id_Categoria,
                         s.SubCategoria
                     }.ToList();
            }
        }


No retorno do jquery vc terá dois foreach... o primeiro percorrendo o data.resultado adicionando o 1o elemento, ai fazendo o segundo foreach percorrendo o this.ListaFilho;

Pjava
   - 27 fev 2014

Só uma pergunta. No seu exemplo vc deu um void e como eu pegaria no jquery o result desse cara?

Murilo Teixeira
   - 27 fev 2014

o void foi só pra mostrar, esse código você colocaria dentro da sua função que retorna o seu json...

#Código

     [HttpPost]
        public JsonResult MontaMenuInferior()
        {
            AgaxturCmsEntities db = new AgaxturCmsEntities();
            try
            {
                var resultado = from c in db.TB_MENUSUPERIOR_CATEGORIAS
                                where c.Ativo == 1
                                select new
                                {
                                    c.id,
                                    c.Categoria,
                                    ListaSubMenu = from s in db.TB_MENUSUPERIOR_SUBCATEGORIAS
                                                   where c.id = s.Id_Categoria && s.Ativo == 1 && s.CdCliente == 1
                                                   select new
                                                   {
                                                       s.Id_Categoria,
                                                       s.SubCategoria
                                                   }.ToList(),
                               }.ToList();
 
                return Json(new { resultado }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new { resultado = ex.Message }, JsonRequestBehavior.AllowGet);
            }
        }

Pjava
   - 28 fev 2014

Em realidade a subquery já estava retornando sim. Eu é que estava fazendo de forma errada. Deu certo Veja como ficou minha jquery.

#Código

function MontaMenuInferior() {

    var str = "";
    $.ajax({
        url: '/Home/MontaMenuInferior',
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        type: "POST",
        success: function (data) {
                   
            $(data.resultado).each(function () {

                str = str + '<ul class="grid_4">' +
                                    '<li>' + this.Categoria + '</li>';
                                       

                $(this.subconsulta).each(function () {

                    str = str + '<li><a href="#" title="">' + this.SubCategoria + '</a></li>';
                });

                str = str + '</ul>';

                $('#menufooter').append(str);

                str = "";
                       
            });
        },
        error: function (error) {

        }
    });
}