none
Problemas com Linq RRS feed

  • Pergunta

  • Pessoal,

    Boa Tarde!

    Estou fazendo uma query com linq usando o código abaixo. Estou buscando imoveis(db.imovel) e para cada imovel trazer a foto correspondente(db.fotoimovel). O detalhe é q para cada imovel pode-se ter várias fotos e nesse caso gostaria que retornasse apenas uma. Quando realizo a query retorna vários imoveis, o mesmo imóvel para cada foto.

    Linq

    var retorno = (from c in db.imovel
                               join p in db.fotoimovel on c.idImovel equals p.idImovel
                               where c.idImovel == codigo
                               select new DadosImovel
                               {
                                   Id = c.idImovel,
                                   Titulo = c.TituloImovel,
                                   Descricao = c.DescricaoImovel,
                                   Foto = p.NomeFotoImovel,
                                   TipoImovel = c.TipoImovel,
                                   Endereco = c.EnderecoImovel,
                                   Complemento = c.ComplementoImovel,
                                   Bairro = c.BairroImovel,
                                   Cidade = c.CidadeImovel,
                                   Estado = c.EstadoImovel,
                                   CEP = c.CEPImovel,
                                   MetragemImovel = c.MetragemImovel,
                                   QtdComodoImovel = c.QtdComodoImovel,
                                   QtdQuartoImovel = c.QtdQuartoImovel,
                                   QtdBanheiroImovel = c.QtdBanheiroImovel,
                                   QtdVagaGaragemImovel = c.QtdVagaGaragemImovel,
                                   QtdAndarImovel = c.QtdAndarImovel,
                                   Status = c.StatusImovel,
                                   Ativo = c.AtivoImovel
                               }).ToList().Distinct();

    Agradeço se alguém puder ajudar.


    []´s, Rodney Oliveira

    quarta-feira, 17 de abril de 2013 20:36

Todas as Respostas

  • Qual o critério vc quer usar para o linq saber qual foto vc quer trazer?

    Paulo Marcelo Dalbosco

    quarta-feira, 17 de abril de 2013 20:43
  • Pode ser a primeira foto retornada.

    []´s, Rodney Oliveira

    quarta-feira, 17 de abril de 2013 20:48
  • faz um left join na tabela de fotos e não um join normal. 

    Paulo Marcelo Dalbosco

    quinta-feira, 18 de abril de 2013 02:23
  • Se a entidade fotoimovel for uma propriedade de navegação da entidade imovel não é necessário usar o join. Você pode obter o primeiro item da coleção usando o FirstOrDefault().

    var retorno = (from c in db.imovel			   
    			   where c.idImovel == codigo
    			   select new DadosImovel
    			   {
    				   Id = c.idImovel,
    				   Titulo = c.TituloImovel,
    				   Descricao = c.DescricaoImovel,
    				   Foto = c.fotoimovel.FirstOrDefault().NomeFotoImovel,
    				   TipoImovel = c.TipoImovel,
    				   Endereco = c.EnderecoImovel,
    				   Complemento = c.ComplementoImovel,
    				   Bairro = c.BairroImovel,
    				   Cidade = c.CidadeImovel,
    				   Estado = c.EstadoImovel,
    				   CEP = c.CEPImovel,
    				   MetragemImovel = c.MetragemImovel,
    				   QtdComodoImovel = c.QtdComodoImovel,
    				   QtdQuartoImovel = c.QtdQuartoImovel,
    				   QtdBanheiroImovel = c.QtdBanheiroImovel,
    				   QtdVagaGaragemImovel = c.QtdVagaGaragemImovel,
    				   QtdAndarImovel = c.QtdAndarImovel,
    				   Status = c.StatusImovel,
    				   Ativo = c.AtivoImovel
    			   }).ToList();

    Caso você não tenha criado a propriedade de navegação você poderia utilizar o group by pelo idImovel em vez de usar o Distinct().

    Obs. 1: Você está filtrando a consulta pelo idImovel, este campo é uma chave primária? Se for, a consulta retornará um único registro ao invés de uma lista.
    Obs. 2: Quando digo propriedade de navegação me refiro a um public virtual ICollection<fotoimovel> fotoimovel { get; set; } na entidade imovel.


    Leonardo Lima da Silva

    quinta-feira, 18 de abril de 2013 02:54