none
Colletions generic List RRS feed

  • Pergunta

  • Eu tenho um método que trabalha da seguinte forma:

    Popula os meus "property get set" em Modelos.Cargo, e se eu remover algum, ele continua populando.

    A questão é, eu quero Popupar somente Duas "property get set" da classe Modelos.Cargo, mas sem alterar a estrutura em Modelos.Cargo, como eu faço isso?

     public List<Modelos.Cargo> ListarCargoID(Modelos.Cargo p)
            {
                List<Modelos.Cargo> lista = new List<Modelos.Cargo>();
                using (SqlDataReader dr = new dConexao().ExecuteReader("Pr_Cargo_Selecionar", CommandType.StoredProcedure, CriarParametros(p)))
                {
                    if (dr.HasRows)
                    {
                        while (dr.Read())
                        {
                            lista.Add(new Modelos.Cargo(dr));
                        }
                    }
                    else
                    {
                        lista.Add(new Modelos.Cargo());
                    }
                }
                return lista;
            }


    • Editado CEFL segunda-feira, 20 de maio de 2013 15:08
    segunda-feira, 20 de maio de 2013 15:07

Respostas

  • Carlos....

    Tente assim...

    public List<Modelos.Corp_Cargo> ListarCargoID(Modelos.Corp_Cargo p)
            {
                List<Modelos.Corp_Cargo> lista = new List<Modelos.Corp_Cargo>();
                using (SqlDataReader dr = new dConexao().ExecuteReader("Pr_Corp_Cargo_Selecionar", CommandType.StoredProcedure, CriarParametros(p)))
                {
                    if (dr.HasRows)
                    {
                        while (dr.Read())
                        {
                            lista.Add(new Modelos.Corp_Cargo(dr));
                        }
                    }
                    else
                    {
                        lista.Add(new Modelos.Corp_Cargo());
                    }
                }
                var query = from l in lista select new { l.Cargo_id, l.Cargo_descricao };
                //return query;
                DataGrid1.DataSource = query;
            }

    O código acima deve resolver.

    Mas boas práticas manda abstrair os métodos ao máximo.

    Ex. Passe o DataGrid por parâmetro... etc...


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    • Marcado como Resposta CEFL terça-feira, 21 de maio de 2013 13:49
    segunda-feira, 20 de maio de 2013 21:13

Todas as Respostas

  • Olá Carlos...

    Você pode utilizar um LINQ com TAKE. Assim...

    List<string> a = new List<string>();
                int count = a.Count > 12 : a.Count;
                a.Take(2);

    Espero ter lhe ajudo...

    Abraço


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    segunda-feira, 20 de maio de 2013 15:40
  • Mas como funciona esse take? a.take(2) ele pega as 2 primeiras colunas? existe como eu especificar pelo nome?
    segunda-feira, 20 de maio de 2013 15:46
  • Boa Tarde Calos..

    Segue um exmplo...

    public List<Modelos.Cargo> ListarCargoID(Modelos.Cargo p)
            {
                List<Modelos.Cargo> lista = new List<Modelos.Cargo>();
                using (SqlDataReader dr = new dConexao().ExecuteReader("Pr_Cargo_Selecionar", CommandType.StoredProcedure, CriarParametros(p)))
                {
                    if (dr.HasRows)
                    {
    					foreach (DataRow dr in Dt.Rows)
                        {
                            lista.Add(new Modelos.Cargo()
                            {
    							ID = Convert.ToInt32(dr["Coluna1"].ToString()), 
    							PropriedadeDeCargo = Convert.ToInt32(dr[1].ToString()),
    							Text = dr["coluna3"].ToString(),
    							Link = dr["coluna4"].ToString(),
    							//etc
    						});
    					}
    				}
                }
                return lista;
            }

    • Sugerido como Resposta PachecoDT segunda-feira, 20 de maio de 2013 16:40
    • Editado PachecoDT segunda-feira, 20 de maio de 2013 16:42
    segunda-feira, 20 de maio de 2013 16:40
  • Eu vi em algum lugar, mas não lembro onde, os caras informavam apenas os campos que queriam da classe de origem e a consulta retorna somente aquelas colunas.

    Era mais ou menos assim,

    Classe Cargo (Id, Descricao, Funcao)

    No método de consulta ao banco que listava todas as colunas, ele informa a Classe.ID e retornava apenas a coluna ID, ou a Classe.ID e Classe.Descricao, retornava ambas as colunas.

    Fazia isso dentro de um Generic.List, igual ao que passei acima, estou tentando desvendar como que é feito.

    segunda-feira, 20 de maio de 2013 16:52
  • Desculpe... você quer somente as duas colunas... achei que era somente os 2 primeiros registros.

    Para fazer isso com o LINQ... olha esse exemplo...

    public void Linq11() 
    { 
        List<Product> products = GetProductList(); 
      
        var productInfos = 
            from p in products 
            select new { p.ProductName, p.Category, p.UnitPrice };
    }

    Retorna some 3 de várias colunas.


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    segunda-feira, 20 de maio de 2013 17:06
  • Tem o exemplo completo do Linq11

    Class Product e GetProductList para que eu possa analisar, parece que é isso mesmo.

    segunda-feira, 20 de maio de 2013 17:10
  • Esse exemplo é do Code MSDN.

    Vamos fazer um paralelo entre os casos.

    O GetProdctList retorna uma lista genérica com os products, é o seu ...

    List<Modelos.Cargo> lista = new List<Modelos.Cargo>();

    Não esqueça de marcar o post como útil caso tenha te ajudado.

    segunda-feira, 20 de maio de 2013 17:19
  • Certo,

    Como eu retorno isso dentro do meu código como List para que seja compativel com os controles que possuam DataSource?

    segunda-feira, 20 de maio de 2013 17:26
  • Assim Carlos...

    GridView1.DataSource = lista;
    GridView1.DataBind();

    À disposição...


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    segunda-feira, 20 de maio de 2013 18:19
  • Sim, mas como converte esse select do linq para o retorno em minha lista, ele esta como string.

     var productInfos =
                     from l in lista select new { l.Cargo_id, l.Cargo_descricao };

    segunda-feira, 20 de maio de 2013 18:43
  • No seu código está assim ?

    GridView1.DataSource = productInfos;
    GridView1.DataBind();

    No meu código anterior me referi a "lista" como o objeto tipo lista genérica que contém somente as duas colunas que você deseja.

    Faça um DEBUG e em productInfos, certifique-se que há a informação necessária. Pois pode haver um erro anterior no código.

    À disposição.


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    segunda-feira, 20 de maio de 2013 18:54
  • Então, meu código esta assim, mas se eu coloco no return, dá erro.

    public List<Modelos.Corp_Cargo> ListarCargoID(Modelos.Corp_Cargo p)
            {
                List<Modelos.Corp_Cargo> lista = new List<Modelos.Corp_Cargo>();
                using (SqlDataReader dr = new dConexao().ExecuteReader("Pr_Corp_Cargo_Selecionar", CommandType.StoredProcedure, CriarParametros(p)))
                {
                    if (dr.HasRows)
                    {
                        while (dr.Read())
                        {
                            lista.Add(new Modelos.Corp_Cargo(dr));
                        }
                    }
                    else
                    {
                        lista.Add(new Modelos.Corp_Cargo());
                    }
                }
                var query = from l in lista select new { l.Cargo_id, l.Cargo_descricao };
                return query;
            }


    Error	4	Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<AnonymousType#1>' to 'System.Collections.Generic.List<Modelos.Corp_Cargo>'. An explicit conversion exists (are you missing a cast?)	C:\SISTEMAS\Corp_Cargo.cs	70	20	Dados


    • Editado CEFL segunda-feira, 20 de maio de 2013 19:53
    segunda-feira, 20 de maio de 2013 19:52
  • Carlos...

    Esse erro do return se dá que por conta da cláusula "new", "var query" não é mais uma "List<Modelos.Corp_Cargo" completa. Pois "query" agora tem somente 2 colunas.


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    segunda-feira, 20 de maio de 2013 20:20
  • E como posso fazer para tratar isso e retornar apenas as 2 colunas?
    segunda-feira, 20 de maio de 2013 20:30
  • Carlos....

    Tente assim...

    public List<Modelos.Corp_Cargo> ListarCargoID(Modelos.Corp_Cargo p)
            {
                List<Modelos.Corp_Cargo> lista = new List<Modelos.Corp_Cargo>();
                using (SqlDataReader dr = new dConexao().ExecuteReader("Pr_Corp_Cargo_Selecionar", CommandType.StoredProcedure, CriarParametros(p)))
                {
                    if (dr.HasRows)
                    {
                        while (dr.Read())
                        {
                            lista.Add(new Modelos.Corp_Cargo(dr));
                        }
                    }
                    else
                    {
                        lista.Add(new Modelos.Corp_Cargo());
                    }
                }
                var query = from l in lista select new { l.Cargo_id, l.Cargo_descricao };
                //return query;
                DataGrid1.DataSource = query;
            }

    O código acima deve resolver.

    Mas boas práticas manda abstrair os métodos ao máximo.

    Ex. Passe o DataGrid por parâmetro... etc...


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    • Marcado como Resposta CEFL terça-feira, 21 de maio de 2013 13:49
    segunda-feira, 20 de maio de 2013 21:13