Usuário com melhor resposta
Como usar um Listbox com multipla seleção em uma consulta Linq to Entities?

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?
Respostas
-
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!
- Sugerido como Resposta Mauro Couto quinta-feira, 16 de junho de 2011 15:29
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 8 de julho de 2011 20:44
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(); } } }
-
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 :) -
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. -
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!
- Sugerido como Resposta Mauro Couto quinta-feira, 16 de junho de 2011 15:29
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 8 de julho de 2011 20:44
-
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 :) -
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.
'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
-
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 -