Como filtar Campos em uma Lista de Entidades?
Amigos,
Tenho que usar uma lista de entidades para preencher meu grid, da seguinte forma:
List<Cliente> listaCliente = (db.Cliente.Where(p => p.id >= 100).ToList());
Mas isso me traz todos os campos da tabela. Tem como filtrar esses campos?
Ps: Tenho que usar assim, não posso preencher com generico do tipo:
var cli = from p in db.Cliente where id >= 100 select new {p.id, p.nome};
Tenho obrigatoriamente que fazer da primeira maneira. Como filtar campos na primeira lista?
Obrigado!
Tenho que usar uma lista de entidades para preencher meu grid, da seguinte forma:
List<Cliente> listaCliente = (db.Cliente.Where(p => p.id >= 100).ToList());
Mas isso me traz todos os campos da tabela. Tem como filtrar esses campos?
Ps: Tenho que usar assim, não posso preencher com generico do tipo:
var cli = from p in db.Cliente where id >= 100 select new {p.id, p.nome};
Tenho obrigatoriamente que fazer da primeira maneira. Como filtar campos na primeira lista?
Obrigado!
Daniel Vieira
Curtidas 0
Respostas
Luiz Maia
01/09/2010
Daniel,
Seu codigo esta correto, veja um exemplo de filtro em List:
List<Permission> filteredPermissions = tmpPermissionList.Where(p => r.Role == strRole).ToList();
Qual erro esta acontecendo?
Aguardo
Att
Luiz Maia
GOSTEI 0
Daniel Vieira
01/09/2010
Luizão, eu me expressei mal,
Eu quero projetar campos,
Algo como:
SELECT ID, NOME FROM CLIENTES
Porque aquela consulta me traz todos os campos.
Filtro eu já estava conseguindo, hehe!
Eu quero projetar campos,
Algo como:
SELECT ID, NOME FROM CLIENTES
Porque aquela consulta me traz todos os campos.
Filtro eu já estava conseguindo, hehe!
GOSTEI 0
Luiz Maia
01/09/2010
Daniel,
Veja um exemplo de uma query mais complexa no Linq, apenas adapte-a:
var lancamentos = from p in DB.Pagamentos
join a in DB.Associados on p.Associado equals a.ID_Socio
join r in DB.Regionals on a.ID_Regional equals r.ID_Regional
where p.DataPagamento >= new DateTime(year, month, 01) &&
p.DataPagamento <= new DateTime(year, month, DateTime.DaysInMonth(year, month))
group p by new { p.Associado1.Regional.ID_Regional, p.Associado1.Regional.Nome,
p.Associado1.Regional.Estado, p.TipoPagamento, p.TipoPagamento1.Descricao} into g
orderby g.Key.ID_Regional
select new { g.Key.Nome, g.Key.Estado, valor = g.Sum(p => p.Valor), associados =
(DB.Associados.Where(a=>a.ID_Regional == g.Key.ID_Regional && a.IsAssociado==true)).Count(), pagantes = g.Count(), g.Key.TipoPagamento,g.Key.Descricao};
Qualquer dúvida, me avise!
Abraços
Att
Luiz Maia
GOSTEI 0
Daniel Vieira
01/09/2010
Luiz,
eu nao posso usar generico, com var = select new
Tenho que usar uma lista de entidades.
So preciso escolher quais campos vao ser exibidos, porque da maneira abaixo ela exibe todos os campos:
List<ModelDB.Cliente> listaCliente = (db.Cliente.Where(p => p.nome.Contains("LUIZ")).ToList());
como eu faria para somente buscar id e nome, e nao todos os campos da tabela?
eu nao posso usar generico, com var = select new
Tenho que usar uma lista de entidades.
So preciso escolher quais campos vao ser exibidos, porque da maneira abaixo ela exibe todos os campos:
List<ModelDB.Cliente> listaCliente = (db.Cliente.Where(p => p.nome.Contains("LUIZ")).ToList());
como eu faria para somente buscar id e nome, e nao todos os campos da tabela?
GOSTEI 0
Luiz Maia
01/09/2010
Por que não define as colunas em seu GridView?
GOSTEI 0
Daniel Vieira
01/09/2010
O DataSource eh dinamico cara, conforme a escolha do usuario muda ate a tabela, nao posso fixar campos!
Tem como acertar no select ali os campos a serem projetados?
Tem como acertar no select ali os campos a serem projetados?
GOSTEI 0
Luiz Maia
01/09/2010
Daniel, agora entendi o que realmente quer.
Você tem um List<objeto> com os campos ja setados em sua query, ao montar as colunar do GridView, vc precisa alterar dinamicamente, correto?
GOSTEI 0
Daniel Vieira
01/09/2010
Quase isso Luiz, vamos lá:
Tenho um grid em branco.
Quero setar datasource dinamicamente, o usuario pode escolher um monte de coisa pra mostar.
Quando eu setar, tenho que preencher com um List<Entidade>
Meu problema esta em montar esse List<Entidade> porque ela esta sendo montada com todos os campos da tabela, digamos que seja Cliente a entidade, a List contem todos os campos da tabela cliente, por consequencia o grid exibe todos os campos.
Eu quero projetar apenas alguns campos da tabela ao montar a List<Entidade>
Tenho um grid em branco.
Quero setar datasource dinamicamente, o usuario pode escolher um monte de coisa pra mostar.
Quando eu setar, tenho que preencher com um List<Entidade>
Meu problema esta em montar esse List<Entidade> porque ela esta sendo montada com todos os campos da tabela, digamos que seja Cliente a entidade, a List contem todos os campos da tabela cliente, por consequencia o grid exibe todos os campos.
Eu quero projetar apenas alguns campos da tabela ao montar a List<Entidade>
GOSTEI 0
Luiz Maia
01/09/2010
Daniel
Infelizmente você tera que fazer manipulando seu GridView diretamente.
Sugiro fazer um metodo que sete as colunas dinamicamente para você.
Sabe como fazê-lo?
Qualquer coisa, me fala, blz?
Aguardo
Att
Luiz Maia
GOSTEI 0
Daniel Vieira
01/09/2010
Putz...
É que seguinte, eu peguei 2 classes que me possibilitam ordenar o grid. So que elas somente aceitam List<Entidade>, ou pelo menos so funcionou assim comigo.
Da uma olhada:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Collections;
using System.Reflection;
public class SortableBindingList<T> : BindingList<T>
{
private bool _isSorted;
private ListSortDirection _sortDirection;
private PropertyDescriptor _sortProperty;
//This override shows the binded object, that our list supports sorting
protected override bool SupportsSortingCore
{
get { return true; }
}
//And that it can sort bi-directional
protected override ListSortDirection SortDirectionCore
{
get { return _sortDirection; }
}
//And that it can sort by T typed object's properties
protected override PropertyDescriptor SortPropertyCore
{
get { return _sortProperty; }
}
//This is the method, what gets called when the sort event occurs in the bound object
protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
{
List<T> items = this.Items as List<T>;
if (items != null)
{
PropertyComparer<T> pc = new PropertyComparer<T>(prop.Name, direction);
items.Sort(pc);
_isSorted = true;
_sortDirection = direction;
_sortProperty = prop;
}
else
{
_isSorted = false;
}
OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
//This shows if our list is already sorted or not
protected override bool IsSortedCore
{
get { return _isSorted; }
}
//Removing the sort
protected override void RemoveSortCore()
{
_isSorted = false;
}
public SortableBindingList(IList<T> list)
: base(list)
{
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Collections;
using System.Reflection;
public class PropertyComparer<T> : IComparer<T>
{
private PropertyInfo _property;
private ListSortDirection _sortDirection;
public PropertyComparer(string sortProperty, ListSortDirection sortDirection)
{
_property = typeof(T).GetProperty(sortProperty);
this._sortDirection = sortDirection;
}
public int Compare(T x, T y)
{
object valueX = _property.GetValue(x, null);
object valueY = _property.GetValue(y, null);
if (_sortDirection == ListSortDirection.Ascending) return Comparer.Default.Compare(valueX, valueY);
return Comparer.Default.Compare(valueY, valueX);
}
}
Depois que passo um List<Entidade> pra ela, e seto o datasource do grid, o grid pode ser ordenado clicando no header.
Sem isso eu nao consigo.
Eu nao utilizo isso no dia a dia, utilizo o classico
var l = from p in db.cliente select new {p.codigo, p.nome}
So que isso nao permite ordenacao.
Teria como arrumar essas 2 classes pra aceitarem um IQueryable (o retorno dos meus metodos, com o select generico acima)
Eu peguei na internet essas classes prontas!
É que seguinte, eu peguei 2 classes que me possibilitam ordenar o grid. So que elas somente aceitam List<Entidade>, ou pelo menos so funcionou assim comigo.
Da uma olhada:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Collections;
using System.Reflection;
public class SortableBindingList<T> : BindingList<T>
{
private bool _isSorted;
private ListSortDirection _sortDirection;
private PropertyDescriptor _sortProperty;
//This override shows the binded object, that our list supports sorting
protected override bool SupportsSortingCore
{
get { return true; }
}
//And that it can sort bi-directional
protected override ListSortDirection SortDirectionCore
{
get { return _sortDirection; }
}
//And that it can sort by T typed object's properties
protected override PropertyDescriptor SortPropertyCore
{
get { return _sortProperty; }
}
//This is the method, what gets called when the sort event occurs in the bound object
protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
{
List<T> items = this.Items as List<T>;
if (items != null)
{
PropertyComparer<T> pc = new PropertyComparer<T>(prop.Name, direction);
items.Sort(pc);
_isSorted = true;
_sortDirection = direction;
_sortProperty = prop;
}
else
{
_isSorted = false;
}
OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
//This shows if our list is already sorted or not
protected override bool IsSortedCore
{
get { return _isSorted; }
}
//Removing the sort
protected override void RemoveSortCore()
{
_isSorted = false;
}
public SortableBindingList(IList<T> list)
: base(list)
{
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Collections;
using System.Reflection;
public class PropertyComparer<T> : IComparer<T>
{
private PropertyInfo _property;
private ListSortDirection _sortDirection;
public PropertyComparer(string sortProperty, ListSortDirection sortDirection)
{
_property = typeof(T).GetProperty(sortProperty);
this._sortDirection = sortDirection;
}
public int Compare(T x, T y)
{
object valueX = _property.GetValue(x, null);
object valueY = _property.GetValue(y, null);
if (_sortDirection == ListSortDirection.Ascending) return Comparer.Default.Compare(valueX, valueY);
return Comparer.Default.Compare(valueY, valueX);
}
}
Depois que passo um List<Entidade> pra ela, e seto o datasource do grid, o grid pode ser ordenado clicando no header.
Sem isso eu nao consigo.
Eu nao utilizo isso no dia a dia, utilizo o classico
var l = from p in db.cliente select new {p.codigo, p.nome}
So que isso nao permite ordenacao.
Teria como arrumar essas 2 classes pra aceitarem um IQueryable (o retorno dos meus metodos, com o select generico acima)
Eu peguei na internet essas classes prontas!
GOSTEI 0
Luiz Maia
01/09/2010
Daniel, você quer é ordenar o Grid ou selecionar as colunas dinamicamente? Não estou entendendo bem seu post.
Favor explicar melhor o contexto, que podemos achar uma solução alternativa para seu problema, blz?
Fico aguardando aqui!
Abraços
Luiz Maia
GOSTEI 0
Daniel Vieira
01/09/2010
Preencher dinamicamente eu consigo Luiz (por isso eu falei que nao posso criar as colunas do grid manualmente, poque eu preencho dinamicamente e pode mudar o datasource em runtime)
Eu preciso eh ordenar ao clicar no header, preenchendo com LINQ.
Com essas 2 classes que mostrei o grid pode ser ordenado, mas ela exige uma List<entidades>
Essa List<entidades> eu so consigo fazer exibir todos os campos, nao consigo projetar apenas alguns.
Eu queria projetar apenas alguns campos da entidade(tabela) no grid.
Eu preciso eh ordenar ao clicar no header, preenchendo com LINQ.
Com essas 2 classes que mostrei o grid pode ser ordenado, mas ela exige uma List<entidades>
Essa List<entidades> eu so consigo fazer exibir todos os campos, nao consigo projetar apenas alguns.
Eu queria projetar apenas alguns campos da entidade(tabela) no grid.
GOSTEI 0
Luiz Maia
01/09/2010
Daniel,
Tentei achar algo aqui que se adeque ao que esta precisando e não obtive sucesso!
As entidades do List são objetos tipados, o que engessa os atributos da lista. Portanto, desta forma não será possível fazê-lo, já que desta forma, sua entidade se tornaria um tipo anônimo. Mas você pode contornar o problema fazendo um método que gere a query da coleção. Por exemplo: if (condição)
{
var r = from c in db.Cliente where c.Id >= 100 select new NovoCliente { Id = c.Id, Nome = c.Nome };
}
else
{
var r = from c in db.Cliente where c.Id >= 100 select new NovoCliente { Id = c.Id, Nome = c.Nome, Email = c.Email };
} Funcionará! Mas não é uma solução bem arquitetada!
Outra coisa, vc esta usando EDM? Linq?
Não ha possibilidade de usar ADO mesmo não? É muito mais flexivel!
As entidades do List são objetos tipados, o que engessa os atributos da lista. Portanto, desta forma não será possível fazê-lo, já que desta forma, sua entidade se tornaria um tipo anônimo. Mas você pode contornar o problema fazendo um método que gere a query da coleção. Por exemplo: if (condição)
{
var r = from c in db.Cliente where c.Id >= 100 select new NovoCliente { Id = c.Id, Nome = c.Nome };
}
else
{
var r = from c in db.Cliente where c.Id >= 100 select new NovoCliente { Id = c.Id, Nome = c.Nome, Email = c.Email };
} Funcionará! Mas não é uma solução bem arquitetada!
Outra coisa, vc esta usando EDM? Linq?
Não ha possibilidade de usar ADO mesmo não? É muito mais flexivel!
GOSTEI 0
Daniel Vieira
01/09/2010
Luiz, o que seria NovoCliente?
Seria uma entidade (representacao da minha tabela) ?
Seria uma entidade (representacao da minha tabela) ?
GOSTEI 0
Luiz Maia
01/09/2010
Sim, isto mesmo!
Mas independente disto, você pode construir seus métodos separados de forma que cada um retorne os campos que deseja na query.
GOSTEI 0
Luiz Maia
01/09/2010
E ai Daniel, como está indo?
GOSTEI 0
Daniel Vieira
01/09/2010
Estou tentando fazer essa modificação que você me passou mas não está dando certo!
GOSTEI 0
Luiz Maia
01/09/2010
Daniel,
Esta ocorrendo alguma excessão? O que está acontecendo?
GOSTEI 0
Luiz Maia
01/09/2010
E ai Daniel, como está indo? Conseguiu fazer a implementação?
GOSTEI 0
Luiz Maia
01/09/2010
Daniel, como não obtivemos respostas, estamos concluindo o Chamado. Estamos a sua disposição.
Abraços
Att
Luiz Maia
GOSTEI 0