Search This Blog

Showing posts with label Linq to Object. Show all posts
Showing posts with label Linq to Object. Show all posts

Wednesday, 8 January 2014

Reflection Generic List , Generic Method

Tudo bem pessoal,

Bom ano para vocês.

Fiquei um bom tempo para achar essa facilidade que vou compartilhar com vocês, é um caminho para fazer uma consulta de forma genérica não importa que método "Contains,StartsWith" com Linq e Generic utilizando reflection .

Vou tentar fazer um exemplo de forma simples para melhor compreensão da funcionalidade.

C# Code

Primeiro criei uma classe básica para servir de base para a consulta.

   1:   public class Pessoa
   2:      {
   3:          public string Nome { get; set; }
   4:          public string SobreNome { get; set; }     
   5:          public void Popular(){
   6:              Lista = new List<Pessoa>();
   7:              
   8:              Pessoa _p = new Pessoa();
   9:              _p.Nome = "Americo";
  10:              _p.SobreNome = "Arvani";
  11:              Lista.Add(_p);
  12:   
  13:              _p = new Pessoa();
  14:              _p.Nome = "João";
  15:              _p.SobreNome = "Maria";
  16:              Lista.Add(_p);
  17:   
  18:              _p = new Pessoa();
  19:              _p.Nome = "Jose";
  20:              _p.SobreNome = "Da Silva";
  21:              Lista.Add(_p);
  22:          }
  23:          public List<Pessoa> Lista;
  24:      }
 
 
E depois a classe para fazer a LAMBDA dinâmica 
  
 
   1:     public static class LambdaExpressionHelper<T>
   2:      {
   3:   
   4:          /// <summary>
   5:          /// Metodo para consultar de forma generica LAMBDA
   6:          /// </summary>
   7:          /// <param name="propertyName">Nome da Propriedade</param>
   8:          /// <param name="method">Metodo</param>
   9:          /// <param name="args">Valor</param>
  10:          /// <returns>Lambda Expression</returns>        
  11:          public static Expression<Func<T, bool>>       
  12:          Build(string propertyName, string method, params object[] args)
  13:          {            
  14:              
  15:              var propertyInfo = typeof(T).GetProperty(propertyName);           
  16:   
  17:              var e = Expression.Parameter(typeof(T), "e");
  18:              var m = Expression.MakeMemberAccess(e, propertyInfo);
  19:   
  20:              var mi = m.Type.GetMethod(method, args.Select(a => a.GetType()).ToArray());
  21:              var c = args.Select(a => Expression.Constant(a, a.GetType())).ToArray();
  22:   
  23:              Expression call = Expression.Call(m, mi, c);
  24:   
  25:              Expression<Func<T, bool>> lambda = 
Expression.Lambda<Func<T, bool>>(call, e);
  26:              return lambda;
  27:          }
  28:      }
 
 
E por ultimo um evento click em um botão para executar
 
 
   1:  protected void btnExecClick(object sender, EventArgs e)
   2:          {
   3:              Pessoa p = new Pessoa();
   4:              p.Popular();
   5:              
   6:              var expr = LambdaExpressionHelper<Pessoa>.Build(txtCampo.Text, "StartsWith",
 txtValor.Text);
   7:   
   8:              var l = p.Lista.Where(expr.Compile());
   9:   
  10:              GridView1.DataSource = l;
  11:              GridView1.DataBind();       
  12:          }
 
HTML/ASPX 
 


   1:  <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
 Inherits="aarvanilab.Default" %>
   2:   
   3:  <!DOCTYPE html>
   4:   
   5:  <html xmlns="http://www.w3.org/1999/xhtml">
   6:  <head runat="server">
   7:      <title></title>
   8:  </head>
   9:  <body>
  10:      <form id="form1" runat="server">
  11:      <div>
  12:          
  13:          <asp:TextBox ID="txtCampo" runat="server" Text="Campo"/>
  14:          <asp:TextBox ID="txtValor" runat="server" Text="Valor"/>
  15:   
  16:          <asp:Button ID="Button1"  runat="server" Text="Executar" OnClick="btnExecClick" />
  17:   
  18:          <asp:GridView ID="GridView1" runat="server">
  19:          </asp:GridView>    
  20:      </div>
  21:      </form>
  22:  </body>
  23:  </html>
 
 
 
Demo em execução

 Nessa execução consultei o campo "Nome" com os dados que iniciam com a letra A, no caso meu nome

 






 
 Nessa execução consultei o campo "Nome" com os dados que iniciam com a letra J, com os dados restantes











Acredito que isso ajuda muito com o caso de filtros dinâmicos com Contains independente da propriedade.

Até a próxima.
Américo 

Thursday, 14 February 2013

Master + Details Sencha Extjs 4 ASP MVC

Olá, Pessoal

Bom ano para vocês.

Venho mostrar uma coisa que me deu muita dor de cabeça, um grid + subgrid , ou como preferir master + details, até achei umas soluções prontas do extjs ( Ext.ux.RowExpander ) mas o problema é que quando você quer utilizar as funções de digamos expandir todos os details por padrão, ele fica muito lento e não funciona corretamente .

Então achei uma solução Ext.grid.feature.RowBody , uma particularidade gostei desse plugin  poque  pude aplicar a modelagem de hasmany ( um para muitos ) do model do Ext . Por padrão ele já abre o details do grid, e consegui melhorar drasticamente a performance do processamento do grid.

Em um projeto particular que precisava de uma visão de Pedidos de Compras com os Itens em master + details, acredito que foi a melhor solução com ExtJS 4 .

Veja abaixo a codificação

Classes


 public class Item
    {

        public string NumPedido { get; set; }
        public int    NumItem { get; set; }
        public string CodProduto { get; set; }
        public string DescProduto { get; set; }      
        public double  ValUnitario { get; set; }
        public int Qtd { get; set; }
        public double Valor { get; set; }
    }

 public class Pedido
    {

        #region >> SINGLETON <<

        static readonly Pedido _instance = new Pedido();

        static Pedido() { }
        Pedido() { }

        public static Pedido Instance
        {
            get
            {
                return _instance;
            }
        }

        #endregion

        public string NumPedido { get; set; }

        public int CodCliente { get; set; }

        public string NomCliente { get; set; }
                
        public int Qtd { get; set; }

        public double Valor { get; set; }

        public List<Item> ListItens { get; set; }

        public List<Pedido> List()
        { 
            List<Pedido> _listPedido = new List<Pedido>();

            Pedido _pedido = new Pedido();
            _pedido.NumPedido = "1";
            _pedido.Qtd   = 10;
            _pedido.Valor = 10.00;
            _pedido.CodCliente = 1500;
            _pedido.NomCliente = "João";

            List<Item> _listItem = new List<Item>();
            Item _item = new Item();
            _item.NumPedido = "1";
            _item.NumItem = 1;
            _item.ValUnitario = 1.00;
            _listItem.Add(_item);

            _pedido.ListItens = _listItem;

            _listPedido.Add(_pedido);

            _pedido = new Pedido();
            _pedido.NumPedido = "2";
            _pedido.Qtd = 20;
            _pedido.Valor = 20.00;
            _pedido.CodCliente = 1505;
            _pedido.NomCliente = "José";

            _listItem = new List<Item>();
            _item = new Item();
            _item.NumPedido = "2";
            _item.NumItem = 1;
            _item.ValUnitario = 2.00;            
            _listItem.Add(_item);

            _pedido.ListItens = _listItem;

            _listPedido.Add(_pedido);
                   
            return  _listPedido;
        }


    }

Controller
 
namespace aarvanilabExtJS4.Controllers
{
    public class PedidoController : Controller
    {
        //
        // GET: /Pedido/

        public ActionResult Index()
        {
            return View();
        }

        public JsonResult List()
        {            
            var _list = Models.Pedido.Instance.List();                                             
            return Json(new { total = _list.Count, data = _list.ToList() }, JsonRequestBehavior.AllowGet);
        }

    }
}

SCRIPT JAVASCRIPT 
 
<script type="text/javascript">

    //Definição dos Models          

    Ext.define('pedido', { 
        extend: 'Ext.data.Model', 
        fields: [   //Definição dos Campos do Pedido
                            
                        { name: 'NumPedido', type: 'string' },
                        { name: 'CodCliente', type: 'string' },
                        { name: 'NomCliente', type: 'string' },
                        { name: 'Qtd', type: 'string' },
                        { name: 'Valor', type: 'string' }

                 ],

        // Relacionamento Pedido - Item  ( 1 X N )
        hasMany: { 
            model: 'item',
            name: 'ListItens'
        }
    });

    Ext.define('item', {
        extend: 'Ext.data.Model',
        fields: [
                        //Definição dos Campos do Item
                        { name: 'NumPedido', type: 'string' },
                        { name: 'CodCliente', type: 'string' },
                        { name: 'NomCliente', type: 'string' },
                        { name: 'Qtd', type: 'string' },
                        { name: 'Valor', type: 'string' },
                        { name: 'NumItem', type: 'string' },
                        { name: 'CodProduto', type: 'string' },                 
                        { name: 'DescProduto', type: 'string' },                
                        { name: 'ValUnitario', type: 'string' }                 
                  ] ,

        // Relacionamento Item - Pedido  ( 1 X 1 )
        belongsTo: { 
            model: 'pedido',
            name: 'mPedidos',
            foreignKey: 'NumPedido'
        },
        
        hasOne: {
            model: 'pedido',
            name: 'mPedidos',
            foreignKey: 'NumPedido',
            getterName: 'getPedidos'
        }
    });


    //Inicio da execução do SCRIPT
    Ext.onReady(function () {

    //Definição da Store
    var store = Ext.create('Ext.data.Store', {
        pageSize: 25,
        model: 'pedido',
        autoLoad: true,
        proxy: {
            type: 'ajax',
            url: '/Pedido/List',
            reader: {
                type: 'json',
                root: 'data',
                totalProperty: 'total'
            },
            listeners: {
                exception: function (thisProxy, response, operation, options) {
                   alert(response.responseText);
                }
            }
        }
    });

    //Definição da grid
    var grid = new Ext.grid.Panel({
        title: 'Grid',//Titulo
        store: store,//Associar store + grid
        renderTo: Ext.getBody(), // Aonde vai ser renderizado pode ser um id da div
        features: [ //Ferramentas                        
        {
         ftype: 'rowbody', //Details da linha da grid
                        
          // Método para adicionar a tabela de details
          getAdditionalData: function (data, idx, record, orig) {

            var headerCt = this.view.headerCt

            colspan = headerCt.getColumnCount();
            
            var html = '';

                            

            html = '<div>' +
                        '<table  border="1" >' + //Inicio da tabela em HTML
                            '<thead><tr>' + //Header da tabela
                            '<th style="width: 72px;" > Pedido </th>' +
                            '</tr></thead>';


            // Listar os itens do Pedido

            Ext.each(record.ListItensStore.data.items, function (chilrecord) {

                html = html + '<tbody><tr>' +
                            '<td  >' + chilrecord.data.NumPedido + ' </td>' +                                            
                            '</tr></tbody>';

            });

            //Fim da tabela em HTML
            html = html + ' </table> </div>';
                            
            return {
                rowBody: Ext.String.format(html),
                rowBodyCls: this.rowBodyCls,
                rowBodyColspan: colspan
            };
        }
    }
        ],      
        //Definição das colunas         
        columns: [
        {                                                    
            dataIndex: 'NumPedido', //Associar Campo do model com a coluna
            text: 'Pedido'
        },
        {                                                    
            dataIndex: 'CodCliente',
            text: 'CodCliente'
        },
        {
            dataIndex: 'NomCliente',
            text: 'Nome'
        },
        {                                                    
            dataIndex: 'Qtd',
            text: 'Qtd'
        },
        {                                                    
            dataIndex: 'Valor',
            text: 'Valor'
        }
        ]                                               
        });

    });
</script>
 
Download do projeto 
 
Senha do arquivo aarvani 

Wednesday, 21 November 2012

Passando parametros para o Controller ASP MVC pela Store do EXTJS 4


Olá, Pessoal
Vamos continuar com os exemplos com EXTJS e .NET .

Uma das maiores dificuldades que tive quando comecei a desenvolver com EXT JS foi passar parâmetros entre o JS e o método do controller do ASP MVC. Vou demonstrar com o exemplo de uma consulta passando o parâmetro string ou array para o controle do ASP MVC.
 
CODE C#

public JsonResult GetClientList(string Nome)
{
    try
    {

        if (!string.IsNullOrEmpty(Nome))
        {
            return Json(new
            {
                total = _list.Where(l => l.Value.ToUpper().Contains(Nome.ToUpper())).ToList().Count,
                data = _list.Where(l => l.Value.ToUpper().Contains(Nome.ToUpper())).ToList()
            }, JsonRequestBehavior.AllowGet);
        }
        else
        {
            return Json(new
            {
                total = _list.Count,
                data = _list.ToList()
            }, JsonRequestBehavior.AllowGet);
        }


    }
    catch (Exception ex)
    {
        throw ex;
    }
}
 
CODE JAVASCRIPT

<script type="text/javascript">

    // Defina um modelo de dados
    Ext.define('Cliente', {
        extend: 'Ext.data.Model',
        fields: [
            { name: 'Key', type: 'string' },
            { name: 'Value', type: 'string' }         
        ]
    });

    
    // Crie uma Store e defina o tipo de Proxy e URL
    var store = Ext.create('Ext.data.Store', {
        model: 'Cliente',
        autoload: false,
        proxy: {
            type: 'ajax',
            //nome do controller e o método de consulta com json result
            url: '/Cliente/GetClientList',
            reader: {
                type: 'json',
                root: 'data',
                totalProperty: 'total'
            }
        }
    });
        
    
    // Crie e carregue a grid
    var grid = new Ext.grid.Panel({
        width: 300,
        height: 200,
        title: 'Lista de Clientes',
        renderTo: Ext.getBody(), //Aonde vai ser renderizada a grid , no caso poderia ser uma div        
        store: store, // Vincular Store á grid
        columns: [
                    {
                        dataIndex: 'Key',
                        text: 'Cod',
                        width: 70
                    },
                    {
                        dataIndex: 'Value',
                        text: 'Nome',
                        width: 100
                    }
                  ],
        tbar: [ // Adicionar barra de ferramentas superior
                  {
                  xtype: 'textfield',
                  id: 'txtConsultar',
                  fieldlabel: 'Nome'
              },
                  {
                      xtype: 'button',
                      text: 'Consultar',
                      handler: function () {

                          // Pegar o que foi digitado no text
                          var txt = Ext.getCmp('txtConsultar');
                          
                          //Passando o parametro para o método do controlle 
                          store.load({
                              params: {
                                  'Nome': txt.value
                              }
                          }
                          );
                      }
                  }
               ]
    }
         );

  
   //Carregue a store
   store.load();

</script>
 
Até a próxima.

Wednesday, 12 September 2012

Agrupar Generic List Usando Reflection

Olá Pessoal,

Conforme tinha falado , estou enviando mais um ajudinha para agrupar dados de uma lista do tipo generics object.

/// <summary>
/// Método para agrupar itens da lista dinamico
/// </summary>
/// <param name="_property"> Propriedade da lista</param>
/// <param name="_list"> Lista que gostaria de Agrupar</param>
/// <returns>Lista Agrupada</returns>
public List<Entidade.Pedido> DoGroup(
                                string _property,                                            
                                List<Entidade.Pedido> _list
                                )
{
_list.GroupBy(c => new { typeof(Entidade.Pedido).GetProperty(_property).Name });   
return _list;
}
Até a próxima.

Tuesday, 11 September 2012

Ordenar um GENERIC LIST de modo dinâmico usando Reflection

Olá , Pessoal
Estou um pouco ocupado trabalhando com EXTJS com ASP MVC 3 e está um pouco difícil , mas , me sobrou um tempinho para mandar uma dica que achei super útil. Ordenar um GENERIC LIST de modo dinâmico.
 
        /// <summary>
        /// Método para ordernar itens da lista dinamico
        /// </summary>
        /// <param name="_property"> Propriedade da lista </param>
        /// <param name="_direction"> Direção </param>
        /// <param name="_list"> Lista que gostaria de ordenar</param>
        /// <returns>Lista Ordenada</returns>
        public List<Entidade.Pedido> DoOrder (
                                               string _property , 
                                               string _direction , 
                                               List<Entidade.Pedido> _list
                                              )
        {                            

            if (_direction == "ASC")
            {
                _list = _list.OrderBy(plist => typeof(Entidade.Pedido).GetProperty(_property).GetValue(plist, null)).ToList();
            }
            if (_direction == "DESC")
            {
                _list = _list.OrderByDescending(plist => typeof(Entidade.Pedido).GetProperty(_property).GetValue(plist, null)).ToList();
            }

            return _list;
        }
Espero que tenham gostado e vou trazer coisas novas.

Monday, 30 April 2012

De Gereric List para DataTable

Olá , Pessoal

Depois de um bom tempo sem postar nada volto eu , para falar sobre uma funcionalidade que achei super interessante , estou voltando a trabalhar com ASP webforms e algumas coisas que estou achando legal vou começar a compartilhar com vocês.

Como exemplo a maioria dos componentes do ASP webforms trabalhão com ADO.NET para persistência de dados , por conta disso temos as vezes , a necessidade de transformar uma lista do tipo LIST ou list generic em uma DataTable com exemplo que vou mostrar para vocês como popular um GridView com uma DataTable que tem como base de informações um LIST.

Exemplo:

Arquivo : DbTools.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.ComponentModel;

namespace aarvaniExample1
{
    public class DbTools
    {
        /// <summary>
        /// Método para conversão de uma lista tipo generic LIST<T> para DataTable
        /// </summary>
        /// <param name="data"> List<T></param>
        /// <returns>DataTable</returns>
        public static DataTable ConvertListToDataTable(List<Object> data)
        {
            //Pegar o primeiro registro e listar suas propriedades            
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(data.FirstOrDefault());
            //Criar e instanciar a tabela auxiliar em memória
            DataTable table = new DataTable();

            //Consultar item a item das propriedades
            foreach (PropertyDescriptor prop in properties)
                //Adicionar programaticamente a coluna com seus respectivos tipos
                table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);

            //Consultar coluna a coluna da tabela auxiliar
            foreach (Object item in data)
            {
                //Criar e instanciar a linha
                DataRow row = table.NewRow();

                //Consultar item a item das propriedades
                foreach (PropertyDescriptor prop in properties)
                    //Adicionar o valor da linha na coluna caso não seja nulo
                    row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; table.Rows.Add(row);
            }

            //Retornar a tabela
            return table;
        }
    }
}

Arquivo : Pedido.cs


namespace Entidade
{
 
    /// <summary>
    /// Classe pedido
    /// </summary>
    public class Pedido
    {

                       
        
        #region Propriedades

        public int      Numero { get; set; }        
        public int      ClienteCodigo { get; set; }
        public double   Valor { get; set; }
        public string   Prazo { get; set; }
        public decimal  Quantidade { get; set; }
        
        #endregion

        #region Listas

        public static List<Pedido>  Lista { get; set; }
               
        
        #endregion

    }
}

Arquivo : pedidos_lista.aspx

CODE
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace aarvaniExample1
{
    public partial class pedidos_lista : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //Popular dados
           
            Entidade.Pedido ped = new Entidade.Pedido();
           
            ped.ClienteCodigo = 1;
            ped.Numero = 123;
            ped.Prazo = "30/60";
            ped.Quantidade = 1;
            ped.Valor = 1;
            Entidade.Pedido.Lista = new List<Entidade.Pedido>();
            Entidade.Pedido.Lista.Add(ped);

            List<object> List = new List<object>();
            List.AddRange(Entidade.Pedido.Lista);
           
            gvListaPedidos.DataSource = DbTools.ConvertListToDataTable(List);
            gvListaPedidos.DataBind();
        }

       
    }
}
SOURCE
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="pedidos_lista.aspx.cs" Inherits="aarvaniExample1.pedidos_lista" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="gvListaPedidos" AutoGenerateColumns="true" runat="server" />    
    </div>
    </form>
</body>
</html>

Segue link para baixar o codigo completo.

Download
Espero que gostem .

Até a próxima !

Translate