GARANTIR DESCONTO

Fórum Como filtar Campos em uma Lista de Entidades? #385337

01/09/2010

0

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!
Daniel Vieira

Daniel Vieira

Responder

Posts

01/09/2010

Luiz Maia

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    
Responder

Gostei + 0

01/09/2010

Daniel Vieira

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!
Responder

Gostei + 0

01/09/2010

Luiz Maia

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  
Responder

Gostei + 0

01/09/2010

Daniel Vieira

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?
Responder

Gostei + 0

01/09/2010

Luiz Maia

Por que não define as colunas em seu GridView?
Responder

Gostei + 0

01/09/2010

Daniel Vieira

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?
Responder

Gostei + 0

01/09/2010

Luiz Maia

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?
Responder

Gostei + 0

01/09/2010

Daniel Vieira

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>
Responder

Gostei + 0

01/09/2010

Luiz Maia

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
Responder

Gostei + 0

01/09/2010

Daniel Vieira

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!
Responder

Gostei + 0

01/09/2010

Luiz Maia

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
Responder

Gostei + 0

02/09/2010

Daniel Vieira

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.
Responder

Gostei + 0

02/09/2010

Luiz Maia

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!
Responder

Gostei + 0

02/09/2010

Daniel Vieira

Luiz, o que seria NovoCliente?

Seria uma entidade (representacao da minha tabela) ?
Responder

Gostei + 0

03/09/2010

Luiz Maia

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.  
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar