none
Como fazer where num objeto que tem uma lista dentro de outra lista? RRS feed

  • Pergunta

  • Olá amigos,

    estou com uma dúvida no entity e já busquei solução na net, porém as soluções que eu encontrei não retornam o esperado. Minha dúvida é a seguinte, vamos dizer que tenho os seguintes objetos:

    public class Pais { public int Id { get; set;} //Para fins de exemplo não vou inicializar as listas. public List<Estado> Estados { get; set;} } public class Estado { public int Id { get; set;} public List<Cidade> Cidades { get; set; } public Pais Pais { get; set;} public int IdPais { get; set;} } public classe Cidade { public int Id { get; set;}

    public int idEstado { get; set;}

    public Estado Estado { get; set;} public string Nome { get; set;} }


    Eu quero fazer uma consulta linq ou lambda que retorne uma lista de Paises que contem cidades com o nome California.

    Obter uma List<Pais> sendo que Pais => List<Estado> => Lista<Cidade>.Nome == "California"

    Será que alguém poderia me ajudar?

    quarta-feira, 3 de abril de 2013 19:17

Respostas

  • var colecao = contexto.Cidade
    .Where(c=>c.nome = "California")
    .Select(c => c.Estado.Pais);
    
    ou se não
    
    var colecao = contexto.Paises
    .SelectMany(p=>p.Estados.Where(e=>e.Cidades.Any(c=>c.nome ="Califonia")));
    
    
    
    sexta-feira, 5 de abril de 2013 22:46
  • sua estrutura 

     public class Pais
        {
            public int Id { get; set; }
            public string Nome { get; set; }
    
            //Para fins de exemplo não vou inicializar as listas.
            public List<Estado> Estados { get; set; }
        }
    
        public class Estado
        {
            public int Id { get; set; }
    
            public List<Cidade> Cidades { get; set; }
    
            public Pais Pais { get; set; }
    
            public int IdPais { get; set; }
        }
    
        public class Cidade
        {
            public int Id { get; set; }
            public int idEstado { get; set; }
    
            public Estado Estado { get; set; }
    
            public string Nome { get; set; }
        }

    Preenchendo dados

    var paises = new List<Pais>
                {
                    new Pais{ Id = 1,Nome="BRA",
                        Estados = new List<Estado>{
                            new Estado { Id = 52, 
                                Cidades = new List<Cidade>()
                                {
                                    new Cidade{  Id = 1, Nome="California"},
                                    new Cidade{  Id = 2, Nome="Gyn"},
                                    new Cidade{  Id = 3, Nome="Rio Verde"},
                                }
                            },
                            new Estado { Id = 53, 
                                Cidades = new List<Cidade>()
                                {
                                    new Cidade{  Id = 4, Nome="Cuiaba"},
                                    new Cidade{  Id = 5, Nome="Pontes e Lacerda"},
                                    new Cidade{  Id = 6, Nome="Agua Boa"},
                                }
                            }
                        }
                    },
                    new Pais{ Id = 2,Nome ="EUA",
                        Estados = new List<Estado>{
                            new Estado { Id = 22, 
                                Cidades = new List<Cidade>()
                                {
                                    new Cidade{  Id = 1, Nome="Cidade221"},
                                    new Cidade{  Id = 1, Nome="Cidade222"},
                                    new Cidade{  Id = 1, Nome="Cidade223"},
                                }
                            },
                            new Estado { Id = 33, 
                                Cidades = new List<Cidade>()
                                {
                                    new Cidade{  Id = 1, Nome="Cidade331"},
                                    new Cidade{  Id = 1, Nome="Cidade332"},
                                    new Cidade{  Id = 1, Nome="California"},
                                }
                            }
                        }
                    }
                };

    CONSULTA por lambda

       var result = paises.Where(x => x.Estados.Where(y => y.Cidades.Where(o => o.Nome == "California").Count() > 0).Count() > 0).ToList();
    
                foreach (var item in result)
    		        Console.WriteLine(item.Nome);

    quinta-feira, 4 de abril de 2013 00:16

Todas as Respostas

  • sua estrutura 

     public class Pais
        {
            public int Id { get; set; }
            public string Nome { get; set; }
    
            //Para fins de exemplo não vou inicializar as listas.
            public List<Estado> Estados { get; set; }
        }
    
        public class Estado
        {
            public int Id { get; set; }
    
            public List<Cidade> Cidades { get; set; }
    
            public Pais Pais { get; set; }
    
            public int IdPais { get; set; }
        }
    
        public class Cidade
        {
            public int Id { get; set; }
            public int idEstado { get; set; }
    
            public Estado Estado { get; set; }
    
            public string Nome { get; set; }
        }

    Preenchendo dados

    var paises = new List<Pais>
                {
                    new Pais{ Id = 1,Nome="BRA",
                        Estados = new List<Estado>{
                            new Estado { Id = 52, 
                                Cidades = new List<Cidade>()
                                {
                                    new Cidade{  Id = 1, Nome="California"},
                                    new Cidade{  Id = 2, Nome="Gyn"},
                                    new Cidade{  Id = 3, Nome="Rio Verde"},
                                }
                            },
                            new Estado { Id = 53, 
                                Cidades = new List<Cidade>()
                                {
                                    new Cidade{  Id = 4, Nome="Cuiaba"},
                                    new Cidade{  Id = 5, Nome="Pontes e Lacerda"},
                                    new Cidade{  Id = 6, Nome="Agua Boa"},
                                }
                            }
                        }
                    },
                    new Pais{ Id = 2,Nome ="EUA",
                        Estados = new List<Estado>{
                            new Estado { Id = 22, 
                                Cidades = new List<Cidade>()
                                {
                                    new Cidade{  Id = 1, Nome="Cidade221"},
                                    new Cidade{  Id = 1, Nome="Cidade222"},
                                    new Cidade{  Id = 1, Nome="Cidade223"},
                                }
                            },
                            new Estado { Id = 33, 
                                Cidades = new List<Cidade>()
                                {
                                    new Cidade{  Id = 1, Nome="Cidade331"},
                                    new Cidade{  Id = 1, Nome="Cidade332"},
                                    new Cidade{  Id = 1, Nome="California"},
                                }
                            }
                        }
                    }
                };

    CONSULTA por lambda

       var result = paises.Where(x => x.Estados.Where(y => y.Cidades.Where(o => o.Nome == "California").Count() > 0).Count() > 0).ToList();
    
                foreach (var item in result)
    		        Console.WriteLine(item.Nome);

    quinta-feira, 4 de abril de 2013 00:16
  • var colecao = contexto.Cidade
    .Where(c=>c.nome = "California")
    .Select(c => c.Estado.Pais);
    
    ou se não
    
    var colecao = contexto.Paises
    .SelectMany(p=>p.Estados.Where(e=>e.Cidades.Any(c=>c.nome ="Califonia")));
    
    
    
    sexta-feira, 5 de abril de 2013 22:46
  • contexto.Cidades.where(c=>c.nome ="Califonia").Select(x=> x.Estado.Pais).Distinct()

    http://renefc3.wordpress.com/ renefc3@gmail.com @renefc3

    segunda-feira, 8 de abril de 2013 16:09