none
Entity Framework function que retorna lista RRS feed

  • Pergunta

  • Olá colegas!

    Como faço em linq to entities para criar uma funçao na camada x que retorne uma lista para que eu possa manipular com consultas filtradas. ex com ADO.net:

    Public function tabela() as datatable

            dt = New DataTable
            con = New SqlConnection(My.Settings.conexao)
            cmd = New SqlCommand("SELECT * FROM C_Previsto WHERE id_cCusto = '" & pId_Ccusto & "'", con)
            con.Open()
            dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
            dt.Load(dr)

    return dt

    end function

    Ele me retorna um datatable carregado em memória onde uso dataview para filtros de consultas ou eu posso adicionar datarows, etc. Obrigado.

    quinta-feira, 29 de maio de 2014 15:17

Respostas

  • Eu entendi Junior até ai, porém no datatable eu carrego a tabela inteira nele e depois manipulo as informações fazendo consulta com filtros diversos no meu Form ou em um relatório dinâmico sem ter que buscar no banco novamente. No exemplo que vc me dá eu tenho uma função que acessa o banco e me retorna um list() com ele eu poderia carrega-lo em um grid mas se quiser um novo filtro vou ter que chamar a função novamente que vai acessar o banco novamente. Já no datatable eu carrego uma vez só na memória toda a tabela e manipulo as consultas com dataview. Uma observação, meu ambiente esta em 03 camadas. Obrigado pela ajuda e me desculpe se ainda não peguei seu raciocínio sou novo com linq fiquei muito tempo no ado.net.

     Olá Leandro, quando falamos em Collections podemos utilizar Lambda ou Linq para fazer "busca" utilizando consultando dados na memoria veja :

     Public Function GetAll() As List(Of TB_TEMP)
    
            Dim all As New List(Of TB_TEMP)
    
            'faz a busca no BD
            Using db As New DataUsingLinqToSqlDataContext()
    
                all = db.TB_TEMPs.Select(Function(i As TB_TEMP) i).OrderBy(Function(o As TB_TEMP) o.DATA).ToList()
    
            End Using
    
    
            Return all
    
        End Function

      Veja que eu retorno a variavel all que está carregada com SELECT FULL da minha tabela TB_TEMP, agora vou fazer uma filtro em memoria usando a variavel all :

    'RETORNO DO METODO DA CAMADA NEGOCIOS
            Dim allDados As New List(Of TB_TEMP)
            allDados = New TempBusiness().GetAll()
    
            Dim temp As TB_TEMP = allDados.Where(Function(i As TB_TEMP) i.ID = 10)
            'AGORA MINHA VARIAVEL TEMP CONTEM A LINHA COM O ID VALOR 10
            'FEITO BUSCA NA MEMORIA

    quinta-feira, 29 de maio de 2014 19:40
  • Daniel esta tabela TB_TEMP seria uma tabela do meu banco? Ou seja uma classe do meu edmx certo? E para eu declarar esta variável abaixo eu tenho que ter a camada que possui o .edmx referenciado na minha camada de interface certo?

    Dim allDados As New List(Of TB_TEMP)

     Isso mesmo uma tabela do seu banco, Deve ter sim na camada de interface essa classe, geralmente o que fazemos é que as entidades são vista por todas as camadas, mas a camada "DAO" somente é vista pela "Business", mas depende da arquitetura que trabalha mas é isso mesmo !
    sexta-feira, 30 de maio de 2014 10:15
  • Leandro com o funcao carregado vc pode percorre-lo sem problema exemplo em c#

    if (funcao.count > 0) 

    {

          for (int i = 0; i<= funcao.cont -1; i++)

          {

              string teste = funcao[i].campo_tabela;

          }

    }



    Junior

    quinta-feira, 29 de maio de 2014 19:18

Todas as Respostas

  • var func = (from f in entidade.tabela where condicao select f).toList();


    Junior

    quinta-feira, 29 de maio de 2014 16:47
  • Obrigado Junior

    Mas eu não compreendi, vc criou uma variável que recebe uma lista genérica, agora esta váriável esta carregada com os dados da minha tabela, mas se eu quiser fazer uma nova consulta com filtro nesta variável por exemplo: var func = (from f in entidade.tabela where NOVACONDIÇÃO select f).toList(); Ela vai buscar esta informação no banco novamente? Essa é minha dúvida pois se eu tiver uma tabela com 100000 registros meu desempenho ficaria comprometido.Eu gostaria de saber se é possivel carregar uma vez só e um exemplo de como se fazer isso. Obrigado amigo.

    quinta-feira, 29 de maio de 2014 17:59
  • Leandro é uma variável e como tal se vc executar novamente ela carregará os dados novamente.

    1 - Vc cria o entity framework do seu banco de dados

    2 - Declara a variável do entity assim : nome_do_seu_entity entidade = new nome_do_seu_entity();

    3 - Declara sua variável : dim piid_custo as integer 

    4 - Faz a consulta

    var funcao = (from f in entidade.c_previso where f.id_cCusto = piid_custo select f).tolist()

    No retorno da funcao 

    return funcao

    O entity framework é semalhante ao ADO.NET o exemplo que vc colocou ai no post.


    Junior

    quinta-feira, 29 de maio de 2014 18:17
  • Eu entendi Junior até ai, porém no datatable eu carrego a tabela inteira nele e depois manipulo as informações fazendo consulta com filtros diversos no meu Form ou em um relatório dinâmico sem ter que buscar no banco novamente. No exemplo que vc me dá eu tenho uma função que acessa o banco e me retorna um list() com ele eu poderia carrega-lo em um grid mas se quiser um novo filtro vou ter que chamar a função novamente que vai acessar o banco novamente. Já no datatable eu carrego uma vez só na memória toda a tabela e manipulo as consultas com dataview. Uma observação, meu ambiente esta em 03 camadas. Obrigado pela ajuda e me desculpe se ainda não peguei seu raciocínio sou novo com linq fiquei muito tempo no ado.net.
    quinta-feira, 29 de maio de 2014 18:47
  • Leandro com o funcao carregado vc pode percorre-lo sem problema exemplo em c#

    if (funcao.count > 0) 

    {

          for (int i = 0; i<= funcao.cont -1; i++)

          {

              string teste = funcao[i].campo_tabela;

          }

    }



    Junior

    quinta-feira, 29 de maio de 2014 19:18
  • Eu entendi Junior até ai, porém no datatable eu carrego a tabela inteira nele e depois manipulo as informações fazendo consulta com filtros diversos no meu Form ou em um relatório dinâmico sem ter que buscar no banco novamente. No exemplo que vc me dá eu tenho uma função que acessa o banco e me retorna um list() com ele eu poderia carrega-lo em um grid mas se quiser um novo filtro vou ter que chamar a função novamente que vai acessar o banco novamente. Já no datatable eu carrego uma vez só na memória toda a tabela e manipulo as consultas com dataview. Uma observação, meu ambiente esta em 03 camadas. Obrigado pela ajuda e me desculpe se ainda não peguei seu raciocínio sou novo com linq fiquei muito tempo no ado.net.

     Olá Leandro, quando falamos em Collections podemos utilizar Lambda ou Linq para fazer "busca" utilizando consultando dados na memoria veja :

     Public Function GetAll() As List(Of TB_TEMP)
    
            Dim all As New List(Of TB_TEMP)
    
            'faz a busca no BD
            Using db As New DataUsingLinqToSqlDataContext()
    
                all = db.TB_TEMPs.Select(Function(i As TB_TEMP) i).OrderBy(Function(o As TB_TEMP) o.DATA).ToList()
    
            End Using
    
    
            Return all
    
        End Function

      Veja que eu retorno a variavel all que está carregada com SELECT FULL da minha tabela TB_TEMP, agora vou fazer uma filtro em memoria usando a variavel all :

    'RETORNO DO METODO DA CAMADA NEGOCIOS
            Dim allDados As New List(Of TB_TEMP)
            allDados = New TempBusiness().GetAll()
    
            Dim temp As TB_TEMP = allDados.Where(Function(i As TB_TEMP) i.ID = 10)
            'AGORA MINHA VARIAVEL TEMP CONTEM A LINHA COM O ID VALOR 10
            'FEITO BUSCA NA MEMORIA

    quinta-feira, 29 de maio de 2014 19:40
  • Daniel esta tabela TB_TEMP seria uma tabela do meu banco? Ou seja uma classe do meu edmx certo? E para eu declarar esta variável abaixo eu tenho que ter a camada que possui o .edmx referenciado na minha camada de interface certo?

    Dim allDados As New List(Of TB_TEMP)

    quinta-feira, 29 de maio de 2014 20:15
  • Daniel esta tabela TB_TEMP seria uma tabela do meu banco? Ou seja uma classe do meu edmx certo? E para eu declarar esta variável abaixo eu tenho que ter a camada que possui o .edmx referenciado na minha camada de interface certo?

    Dim allDados As New List(Of TB_TEMP)

     Isso mesmo uma tabela do seu banco, Deve ter sim na camada de interface essa classe, geralmente o que fazemos é que as entidades são vista por todas as camadas, mas a camada "DAO" somente é vista pela "Business", mas depende da arquitetura que trabalha mas é isso mesmo !
    sexta-feira, 30 de maio de 2014 10:15
  • Duvida sanada! Obrigado Daniel e Junior. 
    sexta-feira, 30 de maio de 2014 11:49