none
Uso do Repositório de Dados no Entity Framework 6, método Get() RRS feed

  • Pergunta

  • Bom dia a todos.

    Gostaria de uma ajuda, seguinte. Uso o EF6 usando o repositório de dados conforme próprio artigo da Microsoft, está implementado idêntico ao artigo ( https://msdn.microsoft.com/pt-br/library/dn630213.aspx?f=255&MSPPError=-2147217396 ), mas estou tendo um problema com o metodo Get. Segundo o artigo, o método Get usa o parâmetro e gera a select dinamicamente já filtrando no Where o que está no parâmetro. Pelo menos foi isso que entendi.

    Então fiz todo meu sistema usando o Get, mas aos poucos ele ficou lento. Após usar o profile verifiquei que o Get na verdade está fazendo a consulta toda no banco, sem o Where dos parametros. Poderiam me ajudar.

    Segue um exemplo de como uso:

    ZPRECETAPROCFAB recetapa = new ZPRECETAPROCFABRepositorio().Get(c => c.CODCOLIGADA == procfab.CODCOLIGADA && c.CODFABRIL == procfab.CODFABRIL &&
                    c.IDPROCFAB == procfab.IDPROCFAB && c.CODGRMAQEQ == codgrmaqeq_completo).FirstOrDefault();

    Retorno do select no profile:

    SELECT 
        [Extent1].[CODCOLIGADA] AS [CODCOLIGADA], 
        [Extent1].[CODFABRIL] AS [CODFABRIL], 
        [Extent1].[IDPROCFAB] AS [IDPROCFAB], 
        [Extent1].[IDSEQ] AS [IDSEQ], 
        [Extent1].[IDRECURSO] AS [IDRECURSO], 
        [Extent1].[CODGRMAQEQ] AS [CODGRMAQEQ]
        FROM [dbo].[ZPRECETAPROCFAB] AS [Extent1]

    Como podem ver, não tem o Where.

    segunda-feira, 29 de janeiro de 2018 12:53

Respostas

  • Estou considerando que seu código está idêntico ao do artigo, então faça um teste alterando o tipo do parâmetro da função Get do repositório para Expression<Func<TSource, Boolean>>. Aí ficaria assim:

    public IQueryable<TEntity> Get(Expression<Func<TEntity, bool>> predicate)
    {
        return GetAll().Where(predicate);
    }


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    • Sugerido como Resposta Rafael Almeida - MVPMVP segunda-feira, 29 de janeiro de 2018 14:50
    • Marcado como Resposta jpdelboni segunda-feira, 29 de janeiro de 2018 16:05
    segunda-feira, 29 de janeiro de 2018 13:37

Todas as Respostas

  • Estou considerando que seu código está idêntico ao do artigo, então faça um teste alterando o tipo do parâmetro da função Get do repositório para Expression<Func<TSource, Boolean>>. Aí ficaria assim:

    public IQueryable<TEntity> Get(Expression<Func<TEntity, bool>> predicate)
    {
        return GetAll().Where(predicate);
    }


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    • Sugerido como Resposta Rafael Almeida - MVPMVP segunda-feira, 29 de janeiro de 2018 14:50
    • Marcado como Resposta jpdelboni segunda-feira, 29 de janeiro de 2018 16:05
    segunda-feira, 29 de janeiro de 2018 13:37
  • Estou considerando que seu código está idêntico ao do artigo, então faça um teste alterando o tipo do parâmetro da função Get do repositório para Expression<Func<TSource, Boolean>>. Aí ficaria assim:

    public IQueryable<TEntity> Get(Expression<Func<TEntity, bool>> predicate)
    {
        return GetAll().Where(predicate);
    }


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    Pode ser que também o predicado não esteja sendo compilado, já que o retorno é genérico para FirstOrDefault, assim seria bom utilizar o ToList() isso força a compilação da query, dessa forma o FirstOrDefault já obterá as informações em memória.

    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    Rafael Almeida
    Microsoft Developer .NET
    Microsoft Certified Professional
    Development Leader at JAMSOFT Informática
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter

    segunda-feira, 29 de janeiro de 2018 14:49
  • Deu certinho Juliano. Obrigado.
    segunda-feira, 29 de janeiro de 2018 16:05