Fórum Como filtar Campos em uma Lista de Entidades? #385337
01/09/2010
0
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
Curtir tópico
+ 0Posts
01/09/2010
Luiz Maia
Gostei + 0
01/09/2010
Daniel Vieira
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
01/09/2010
Luiz Maia
Gostei + 0
01/09/2010
Daniel Vieira
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
01/09/2010
Luiz Maia
Gostei + 0
01/09/2010
Daniel Vieira
Tem como acertar no select ali os campos a serem projetados?
Gostei + 0
01/09/2010
Luiz Maia
Gostei + 0
01/09/2010
Daniel Vieira
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
01/09/2010
Luiz Maia
Gostei + 0
01/09/2010
Daniel Vieira
É 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
01/09/2010
Luiz Maia
Gostei + 0
02/09/2010
Daniel Vieira
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
02/09/2010
Luiz Maia
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
02/09/2010
Daniel Vieira
Seria uma entidade (representacao da minha tabela) ?
Gostei + 0
03/09/2010
Luiz Maia
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)