none
Como usar um Listbox com multipla seleção em uma consulta Linq to Entities? RRS feed

  • Pergunta

  • A situação é a seguinte, tenho uma consulta que busca dados em várias tabelas. Porém o usuário terá a opção de filtrar essa consulta com um listbox com múltipla seleção, ja tentei implementar isso de diversas formas sem sucesso.

    Como faço isso?

    quarta-feira, 15 de junho de 2011 20:36

Respostas

Todas as Respostas

  • Ola, veja se vc esta procurando algo parecido com isso:

    using System.Collections.Generic;
    
    namespace System.Linq {
      public static class QueryExtensions {
        public static IEnumerable<TSource> ContainsAny<TSource, TValue>(this IEnumerable<TSource> source, Func<TSource, TValue> predicate, IEnumerable<TValue> lista) {
          return source.Where(s => lista.Contains(predicate.Invoke(s)));
        }
      }
    }
    
    


    Teste:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace Linq {
      class Program {
        class Teste {
          public int iprop { get; set; }
        }
    
        static void Main(string[] args) {
          var lista = new List<Teste>();
          for (int i = 0; i < 100; i++) lista.Add(new Teste() { iprop = i });
    
          var consulta = new int[] { 5, 83, 12, 48 };
    
          var resultado = lista.ContainsAny(item => item.iprop, consulta).ToList();
          resultado.ForEach(item =>
            Console.WriteLine(item.iprop)
            );
    
          Console.ReadLine();
        }
      }
    }
    
    

     

     

    quarta-feira, 15 de junho de 2011 21:58
    Moderador
  • Amigo, tenho um exemplo com dois ListBox, ele selciona em um, aberta um botão e os selecionados aparecem na outra, veja o exemplo:

    protected void Button1_Click(object sender, EventArgs e)
      {
        ListBox2.DataSource = this.consultaUsuarios();
        ListBox2.DataTextField = "Nome";
        ListBox2.DataValueField = "Id";
        ListBox2.DataBind();
      }
    
      private List<exampleModel.Usuario> consultaUsuarios()
      {
        //Cria uma lista com o tipo do seu ID
        //No meu caso é um GUID, na maioria é um INT
        List<Guid> ids = new List<Guid>();
    
        //Copia os itens selecionados para essa lista
        foreach (System.Web.UI.WebControls.ListItem l in ListBox1.Items)
          if (l.Selected)
            ids.Add(new Guid(l.Value));
        
        //Realiza a consulta, verificado se os IDs dos usuários foram selecionados
        var query = from c in ex.Usuario
              where ids.Contains(c.Id)
              select c;
    
        //Retorna a consulta
        return query.ToList();
      }
    



    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    quinta-feira, 16 de junho de 2011 11:51
    Moderador
  • Então. O meu código aqui é bem semelhante ao do Olavo porém quando executo ele retornar a seguinte mensagem de erro.
    LINQ to Entities não reconhece o método 'Boolean Contains(Int32)', que não pode ser convertido em uma expressão de armazenamento.

    Debugando eu descobri que independente do valor que eu passe dentro na lista, sempre da esse problema.

    quinta-feira, 16 de junho de 2011 12:44
  • Olavo, por algum motivo não consegui fazer desse jeito, porém encontrei uma dica em seu blog no seguinte link http://olavooneto.wordpress.com/2011/04/08/entity-sql/.

    Apliquei este recurso numa das tabelas da consulta.

    O código não ficou bonito não mas resolveu meu problema rsrsr.

     

    Obrigado!

    quinta-feira, 16 de junho de 2011 15:29
  • Se você quiser colocar o código aqui para darmos uma olhada
    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Se for útil marque como resposta e faça um Developer feliz :)
    quinta-feira, 16 de junho de 2011 19:06
    Moderador
  •       'recupero os valores da lista em uma variavel
          Dim avTipoVeiculo = Request("avTipoVeiculo")
    
          If IsNothing(avTipoVeiculo) = False Then
            ViewData("avTipoVeiculo") = avTipoVeiculo
    
            Dim arrAvTipo = avTipoVeiculo.Split(",")
            Dim condicao = ""
            Dim cont = 1
    
            'esse loop preenche uma consulta sql
            For Each item In arrAvTipo
              Dim i As Integer = item
    
              If cont < arrAvTipo.Count Then
                condicao = condicao + "it.cod_def_clipping_veiculo_tipo=" + item + " or "
              Else
                condicao = condicao + "it.cod_def_clipping_veiculo_tipo=" + item + " "
              End If
              cont = cont + 1
            Next
    
            'aqui eu executo a consulta
            Dim tiposQuery = db.def_clipping_veiculo_tipo.Where(condicao)
            
            'filtro a consulta principal 
            queryConsulta = From q In queryConsulta From t In tiposQuery Where q.cod_def_clipping_veiculo_tipo = t.cod_def_clipping_veiculo_tipo Select q
          End If
    
    Como eu disse não ficou nada bonito. Passei muito tempo buscando uma solução mais simples só que sem exito. E até agora esse solução ai em cima esta atendendo bem.
    quinta-feira, 16 de junho de 2011 19:32
  • Prezado,

    Conseguiu solucionar essa questão?


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    segunda-feira, 27 de junho de 2011 12:59
    Moderador
  • Solucionei sim usando o recurso no link que passei.
    sexta-feira, 8 de julho de 2011 20:26