none
Dataset tipado - Fazer uso do elemento IN do WHERE RRS feed

  • Pergunta

  • Boa tarde!

    Estou fazendo uso de dataset tipado e tenho uma instrução (por exemplo) que gostaria de executar usando table adapter: SELECT * FROM TabelaExemplo WHERE tipo IN (1,2,3,4,5)

    Como posso fazer uso do elemento IN com table adapters? Estou fazendo uso do Visual Studio 2008.

    Desde já, obrigado pela atenção de todos!

    Atenciosamente,

    Carlos

    segunda-feira, 27 de dezembro de 2010 15:26

Todas as Respostas

  • Carlos,

    Segue um link com exemplo.

    http://social.msdn.microsoft.com/Forums/en/adodotnetdataset/thread/25cc21c4-98f2-4e30-ba80-96608d465e6c


    se a resposta foi útil, classifique :)
    ate mais,

    Rodrigo Soria
    segunda-feira, 27 de dezembro de 2010 21:04
  • Bom dia Rodrigo!

    Agradeço pela sua mensagem! Eu acessei o artigo do outro post (conforme link sugerido no posto anterior) onde foi mencionado para criar um adapter customizado para resolver o problema. Poderia até aplicar essa solução para o que eu preciso, mas gostaria de saber se para os adapters que foram gerados pelo designer, se existe tal solução. Eu apliquei uma solução aqui, mas acho um tanto "tabajara" demais. Veja abaixo a linha de código que fiz:

    rows = empresasTableAdapter.GetData().Select(string.Format("TipoEmpresasId IN ({0})", codigosFiltro));

    Utilizei o método "GetData" existente e por ele, utilizei o método "Select" onde informo a condição do filtro que desejo. A variavel "codigosFiltro" é do tipo string. Minha vontade em melhorar isso é que, ao utilizar o método "GetData" para depois efetuar o filtro pelo método "Select", tenha problema de performance, já que neste adapter posso ter vários registros e desta maneira, ele queira carregar todos os registros primeiro para depois efetuar o filtro (não tenho certeza se dessa forma mesmo que ele executa, apenas impressão que tenho). E outra razão para melhoria que, ao fazer uso do método "Select", perco uma das vantagens do dataset tipado que é evitar erro de digitação, como pode ocorrer na string passada por parâmetro (mas já me certifiquei e foi digitado de maneira correta, rs).

    Tentei fazer algumas tentativas com instruções utilizando LINQ mas não obtive sucesso.

    O que você acha? Se mais alguém quiser opinar, fique a vontade!

    Atenciosamente,

    Carlos

    terça-feira, 28 de dezembro de 2010 11:26
  • Veja

    http://weblogs.asp.net/stevesloka/archive/2008/01/28/linq-to-datatable.aspx


    Não esqueça de usar o componente </> na barra para posta seu código.
    terça-feira, 28 de dezembro de 2010 13:55
  • Você pode fazer a consulta direta em seu DataTable.

    Algo como:

    DataTable dataTable = new DataTable();
    dataTable.Columns.Add(@"ID");

    int[] i = new int[]{ 1, 2, 3, 4};
    var dados = dataTable.AsEnumerable().ToList();
    var query = (from meuDados in dados
    where i.Contains(meuDados.Field<int>(@"ID")) select meuDados).ToList();

     

    É a mesma coisa que ....where in (1,2,3,4)
    ROBERTOSLJUNIOR
    terça-feira, 28 de dezembro de 2010 22:41
  • Roberto,

    Obrigado pela sua mensagem! Da maneira como você apresentou (se eu não estiver errado, caso contrário, me corrija) com dataset tipado, eu terei que carregar todos os dados da tabela primeiro para depois aplicar o filtro, não é verdade? Pelo que entendi, ao inicializar a variável "dados" você pode fazer uso do método padrão "Fill" do seu DataAdapter para preencher a sua variável "dataTable" e com isso, aplicar o filtro na instrução linq sugerida no post anterior. Porém, dessa maneira, não ocorre a mesma situação que fiz que pode acarretar em queda de performance? (carregar todos os dados da tabela primeiro para depois realizar o filtro).

    Você sabe de alguma maneira que, com dataset tipado, seja possível criar um método no DataAdapter para utilizar o elemento IN no Wizard que cria a instrução SQL?

    Seilor, também agradeço pela sua ajuda! Com base no que você sugeriu, eu fiz da maneira abaixo com utilização de dataset tipado:

    int[] i = { 1, 3 };

    var query = (from meusDados in empresasTableAdapter.GetData()
                       where i.Contains(meusDados.Field<byte>("TipoEmpresasId"))
                       select meusDados).ToList();

    DataTable dt = query.ToADOTable(rec => new object[] { query });

    Esta correto o exemplo acima? Fui efetuar um teste e ele gerou uma exceção no método "ToADOTable" informando que a propriedade "Item" já havia sido adicionada. Então neste método eu fiz uma condição para verificar se a coluna já existia e deixou de ocorrer o problema, porém gerou outra exceção, de "ArgumentException" para a linha de código abaixo, justamente para a propriedade "Item" (constatei através do pi.Name):

    dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue(rec, null);

    Você sabe informar o que eu fiz de errado?

    Atenciosamente,

    Carlos

    quarta-feira, 29 de dezembro de 2010 12:03