none
Seleção de campos RRS feed

  • Pergunta

  • Tenho uma camada de acesso a dados que utiliza Entity Framework.

    Gostaria que os métodos de busca de registros fossem mais flexiveis, onde eu pudesse
    passar por parametro os campos que eu gostaria que fossem retornados em uma consulta:

            public virtual IList<TEntity> Listar(Func<TEntity, TEntity> selector = null)
            {
                IQueryable<TEntity> query = _context.Set<TEntity>();


                if (selector != null)
                    query.Select(selector);


                return query.ToList();
            }


    o problema que quando chamo o método não conseguido passar os campos que eu quero


    productRepository.Listar(x => new { x.ProductID, x.ProductName }); 
    //um erro é acusado: Cannot implicitly converte type 'AnonymousType#1' to 'Models.Product'


    como devo criar o parâmetro para o método?
    domingo, 25 de janeiro de 2015 17:34

Respostas

  • Uma solução próxima disso é vc retornar um IQueryable, ao invés de um IList.

    Vc pode aplicar vários critérios de consulta em um objeto IQueryable, o que ajudaria a construir métodos que podem ser reutilizados em várias situações. 

    • Marcado como Resposta Andrey Mariano domingo, 25 de janeiro de 2015 22:35
    • Não Marcado como Resposta Andrey Mariano domingo, 25 de janeiro de 2015 22:35
    • Marcado como Resposta Andrey Mariano domingo, 25 de janeiro de 2015 22:35
    domingo, 25 de janeiro de 2015 19:07

Todas as Respostas

  • Uma solução próxima disso é vc retornar um IQueryable, ao invés de um IList.

    Vc pode aplicar vários critérios de consulta em um objeto IQueryable, o que ajudaria a construir métodos que podem ser reutilizados em várias situações. 

    • Marcado como Resposta Andrey Mariano domingo, 25 de janeiro de 2015 22:35
    • Não Marcado como Resposta Andrey Mariano domingo, 25 de janeiro de 2015 22:35
    • Marcado como Resposta Andrey Mariano domingo, 25 de janeiro de 2015 22:35
    domingo, 25 de janeiro de 2015 19:07
  • Andrei,

    Apenas complementando, no link abaixo há um exemplo do que comentei:

    http://forums.asp.net/t/2013385.aspx?search+query+with+optional+fields+in+entity+framework+

    domingo, 25 de janeiro de 2015 19:10
  • Acredito que a melhor opção é passaram por parâmetro.

    ...

    .Query
    .Select(...)
    ...

    string[] fruits = { "apple", "banana", "mango", "orange", 
                                      "passionfruit", "grape" };
    
                var query =
                    fruits.Select((fruit, index) =>
                                      new { index, str = fruit.Substring(0, index) });
    
                foreach (var obj in query)
                {
                    Console.WriteLine("{0}", obj);
                }
    
                /*
                 This code produces the following output:
    
                 {index=0, str=}
                 {index=1, str=b}
                 {index=2, str=ma}
                 {index=3, str=ora}
                 {index=4, str=pass}
                 {index=5, str=grape}
                */

    Abraços

    terça-feira, 27 de janeiro de 2015 22:51