Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Problemas de Gerar Selects com Id e Nome como mesmo valor

Estou desenvolvendo um projeto que precisa montar vários selects em que os campos de id e value sejam sempre os mesmos, exemplo: select de UF deve ter o id e value com o valor de PR, SP, RJ e por ai vai.

A pouco tempo montei um desses, mas no meu banco não tem tabela de uf, os dados de uf ficam salvos na tabela de cidade, então tive que agrupar para montar o select, porém alem de agrupar os itens da tabela de cidade tive que criar essa entidade de UF com os campos Id e Descrição ambos do tipo string e não queria que essa entidade fosse mapeada para o meu banco.

É possivel criar entidades e elas não serem mapeadas pelo entityframework para serem criadas no banco ?

Sempre que quiser criar um select desses terei que criar novas entidades para representá-lo? Se não como fazer ?

4 respostas

Se vc não precisa obter esses dados do banco, e nem irá salva-los, não precisa ir para o EF.

Faça uma coleção, um array por exemplo.

public JsonResult UFs()
{
    var ufs = new[]{"AC", "BA", "CE"..."RR"};
    return Json(ufs);
}

Vc pode até deixar esse array em outro lugar, se vc quiser reuso-lo.

Isso resolve seu problema?

Oi Alex, entendi sua solução e ela responde a minha primeira pergunta, mas referente a segunda pergunta que fiz vou ser mais especifico, veja o codigo abaixo:

public IList<string> ListarCidades()
        {
            return db.Cidades.Select(r => new { r.Codigo, r.Nome }).ToList();
        }

Ele não compila porque o tipo do retorno da função é diferente, veja que só quero pegar o codigo e nome da entidade cidade e estou retornando uma ilist de string, ele não compila informando do erro de conversão de tipo, não entendo o que esta acontecendo.

solução!

Olá Breno, De fato, não irá funcionar, veja que seu .Select cria um novo objeto, com duas propriedades Codigoe Nome, e seu tipo de retorno é uma simples string

se vc fizer isso:

return db.Cidades.Select(r =>  r.Nome }).ToList();

irá funcionar, pois vc esta retornando um objeto do tipo string

Mas se vc quiser retornar um tipo mais complexo, usando as duas propriedades Código e Nome, ou vc cria um novo Modelo tipo:

public class Cidade {
    public string Codigo { get; set;}
    public string Nome { get; set;}
}

E instanciar ela no .Select, mudando seu retorno no método para IList<Cidade>, ou usa um KeyValuePair

Mas do jeito que esta fazendo agora não vai dar certo mesmo, pq seu objeto de retorno não é uma string

Oi Alex obrigado pela ajuda,

analisei melhor aqui a necessidade e decidi dentro da função do DAO iterar sobre o resultado da busca no banco e retornar uma instancia de cidade com os campos que preciso preenchidos, já que dentro da expressão do select da lambda não é possivel criar objetos complexos pra retorno, não sei se é a melhor maneira mas resolveu aqui, vlw.

public IList<Cidade> SelecionarCidades()
        {
            var cidades = db.Cidades.ToList();
            List<Cidade> listaCidades = new List<Cidade>();

            foreach(Cidade c in cidades)
            {
                listaCidades.Add(new Cidade { Id = c.Id, Nome = c.Nome });
            }

            return listaCidades;
        }