none
Estender pesquisa RRS feed

  • Pergunta

  • Olá,

    como eu não sei o "nome" do que eu quero fazer, então irei explicar.
    Tenho o meu DBContext, e posso fazer o Find, porém ele somente pesquisa pela chave.

    Queria estender as formas de pesquisa, e exemplo buscar por Nome.

    Códigos:

        public class ERPCodeFirstContext : DbContext
        {
            public DbSet<Usuario> Usuario { get; set; }
        }

            public ActionResult Editar(int id)
            {
                Usuario _usuario = db.Usuario.Find(id);
                return View(_usuario);
            }

    Queria fazer: 

    db.Usuario.PorEmpresa();
     Estas pesquisas podem retornar um registro ou lista.


    Abs

    Marlon Tiedt
    www.sesmt.com.br

    quarta-feira, 19 de setembro de 2012 16:32

Respostas

  • Olá Marlon,

    O FIND é um recurso do Entity Framework para fazer a busca exclusivamente pelas primary keys da entidades.

    Para fazer o que vc precisa vc precisa utiliza extension methods, como no exemplo abaixo:

        public static class MyExtensions
        {
            public static int UsuariosAtivos(this DbSet<Usuario> usuarios)
            {
                return usuarios.Where(a => a.Ativo);
            }
        } 
    .

    E sua consulta ficará assim:

        using (Contexto contexto = new Contexto())
        {
            var query = contexto.Usuarios.UsuariosAtivos();
        }
    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quinta-feira, 20 de setembro de 2012 01:31
    Moderador
  • Olá Fernando, não sei se é a melhor solução, mas foi a solução que funcionou...

    A pesquisa estava assim:

                var EspecialidadeMedicaLista = (from lista in db.EspecialidadeMedica                            
                                .Where("(EmpresaID == " + _EmpresaID + " || EmpresaID == 0) && Apagado == \"N\"")
                                .OrderBy(sidx + " " + sord)
                                .Skip(pageIndex * pageSize)
                                .Take(pageSize)
                                select lista);

    Passei para:

    var EspecialidadeMedicaLista = (from lista in db.EspecialidadeMedica                            
      .Where(ERP.Helpers.Functions.SQLWherePadrao())
      .OrderBy(sidx + " " + sord)
      .Skip(pageIndex * pageSize)
      .Take(pageSize)
      select lista);

    Aqui a função generica:

            public static string SQLWherePadrao()
            {
                int empresaID = ((ERP.Helpers.CustomMembershipUser)Membership.GetUser()).EmpresaID;
                return "((EmpresaID == " + empresaID + " || EmpresaID == 0) && a.Apagado == \"N\")";
            }

    Acho que assim posso deixar. O único cuidado é que a pesquisa deve ter sempre EmpresaID...

    Abs..

    Marlon Tiedt
    www.sesmt.com.br

    terça-feira, 25 de setembro de 2012 15:05

Todas as Respostas

  • Marlon, boa noite

    se você deseja fazer uma busca, você precisa especificar quais filtros serão usados através da clausula WHERE, por exemplo se desejo listar todos os usuários cujo nome contenham a letra "O" eu deverei fazer assim

    List<Usuario> usuarios = db.Usuarios.Where(x => x.Nome.Contains("O")).ToList();


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Facebook Olavo Neto
    Linkedin Olavo Neto
    Se for útil marque como resposta e faça um Developer feliz :)

    quarta-feira, 19 de setembro de 2012 21:00
  • Olavo, boa noite,

    isto eu já faço em algumas pesquisas minhas.
    O que eu queria mesmo era fazer:

    db.Usuarios.ListarUsuariosAtivos();

    parecido com o db.Usuarios.Find(0);

    Atenciosamente


    Marlon Tiedt
    www.sesmt.com.br

    quarta-feira, 19 de setembro de 2012 23:07
  • Olá Marlon,

    O FIND é um recurso do Entity Framework para fazer a busca exclusivamente pelas primary keys da entidades.

    Para fazer o que vc precisa vc precisa utiliza extension methods, como no exemplo abaixo:

        public static class MyExtensions
        {
            public static int UsuariosAtivos(this DbSet<Usuario> usuarios)
            {
                return usuarios.Where(a => a.Ativo);
            }
        } 
    .

    E sua consulta ficará assim:

        using (Contexto contexto = new Contexto())
        {
            var query = contexto.Usuarios.UsuariosAtivos();
        }
    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quinta-feira, 20 de setembro de 2012 01:31
    Moderador
  • Obrigadão pelas respostas.

    Mas Fernando, você sabe que sempre terá a pergunta plus sobre as respostas. :)

    Se eu quiser fazer um extension methods para todos os DbSet da minha aplicação como devo fazer?

    Eu imagino que tenho que estender da classe, System.Data.Entity, estou correto?

    Abs



    Marlon Tiedt
    www.sesmt.com.br


    • Editado Marlon Tiedt quinta-feira, 20 de setembro de 2012 14:19
    quinta-feira, 20 de setembro de 2012 14:17
  • Olá Marlon,

    Criar um extension method genérico para todos eu acredito que não dê pra fazer. Testei algumas coisas aqui e não rolou.

    O que vc precisa fazer exatamente?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quinta-feira, 20 de setembro de 2012 16:24
    Moderador
  • Acho que não tem jeito mesmo.

    Lembro que já perguntei sobre isto...
    Somente queria simplificar minha vida, pois como o sistema é multi visões, queria que o SQL já filtra-se, sem precisar em cada classe fazer a regra.

    Abs...


    Marlon Tiedt
    www.sesmt.com.br

    sexta-feira, 21 de setembro de 2012 16:50
  • Olá Marlon,

    Acredito que não vai rolar isso que quer fazer, pq possivelmente os Extension Methods não suportar classes genéricas, como no caso do DbSet.

    Esse lance da regra vc pode fazer de modos diferentes.

    Pode incluir o método na classe de contexto de dados.

    O quem tem mente?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    sexta-feira, 21 de setembro de 2012 16:58
    Moderador
  • Olá Fernando,

    Atualmente não tenho nada em mente no momento...
    Teria alguma sugestão?

    Abs...


    Marlon Tiedt
    www.sesmt.com.br

    sexta-feira, 21 de setembro de 2012 17:06
  • Oi Marlon,

    Suas entidades implementam alguma interface padrão a todas?

    O método que vc quer que trate todas as entidades terá que tipo de lógica?

    Existe algum propriedade em comum entre todas as entidades que estarão envolvidas com essa lógica?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    sexta-feira, 21 de setembro de 2012 17:08
    Moderador
  • Olá Fernando,

    estas classes, são herdadas sim de uma interface.
    A regra implementada seria um "and" padrão em 3 campos.

    Acho que poderia fazer um método para retornar a lista, e lá dentro fazer a regra.
    Vou tentar isto.

    Abs...


    Marlon Tiedt
    www.sesmt.com.br

    sexta-feira, 21 de setembro de 2012 17:45
  • Alguma evolução Marlon?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    terça-feira, 25 de setembro de 2012 02:27
    Moderador
  • Olá Fernando, não sei se é a melhor solução, mas foi a solução que funcionou...

    A pesquisa estava assim:

                var EspecialidadeMedicaLista = (from lista in db.EspecialidadeMedica                            
                                .Where("(EmpresaID == " + _EmpresaID + " || EmpresaID == 0) && Apagado == \"N\"")
                                .OrderBy(sidx + " " + sord)
                                .Skip(pageIndex * pageSize)
                                .Take(pageSize)
                                select lista);

    Passei para:

    var EspecialidadeMedicaLista = (from lista in db.EspecialidadeMedica                            
      .Where(ERP.Helpers.Functions.SQLWherePadrao())
      .OrderBy(sidx + " " + sord)
      .Skip(pageIndex * pageSize)
      .Take(pageSize)
      select lista);

    Aqui a função generica:

            public static string SQLWherePadrao()
            {
                int empresaID = ((ERP.Helpers.CustomMembershipUser)Membership.GetUser()).EmpresaID;
                return "((EmpresaID == " + empresaID + " || EmpresaID == 0) && a.Apagado == \"N\")";
            }

    Acho que assim posso deixar. O único cuidado é que a pesquisa deve ter sempre EmpresaID...

    Abs..

    Marlon Tiedt
    www.sesmt.com.br

    terça-feira, 25 de setembro de 2012 15:05
  • Olá Marlon,

    Posso marcar sua resposta como solução para o tópico?

    Qual foi a resposta que direcionou sua solução?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    segunda-feira, 1 de outubro de 2012 12:03
    Moderador
  • Olá Fernando, 

    estou marcando a respostas sua como valida. Se quiser marcar a minha, também é valida, pois 2 formas de fazer a mesma rotina...

    Tks...

    Abs


    Marlon Tiedt
    www.sesmt.com.br

    segunda-feira, 1 de outubro de 2012 12:07