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>
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
No comments:
Post a Comment