Novamente problema com jquery, ajax e bd

.NET

27/02/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.

[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.

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

<ul class="grid_4" id="brasil">
                          
                        </ul>
                        <ul class="grid_4" id="americasul">
                            
                        </ul>
Pjava

Pjava

Curtidas 0

Respostas

Pjava

Pjava

27/02/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.

[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);
            }
        } 
GOSTEI 0
Murilo Teixeira

Murilo Teixeira

27/02/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.

        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;
GOSTEI 0
Pjava

Pjava

27/02/2014

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

Murilo Teixeira

27/02/2014

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


     [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);
            }
        }
GOSTEI 0
Pjava

Pjava

27/02/2014

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

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) {

        }
    });
}
GOSTEI 0
POSTAR