zoukankan      html  css  js  c++  java
  • Lambda动态创建

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Linq.Expressions;
    
    namespace ExpressionToSql
    {
        public class LambdaHelper
        {
            /// <summary>
            /// Id等于
            /// </summary>
            /// <param name="Id"></param>
            /// <returns></returns>
            public Func<Model, bool> CreateFilterID(int Id)
            {
                ParameterExpression obj = Expression.Parameter(typeof(Model), "obj");
    
                ConstantExpression constant = Expression.Constant(Id);
    
                MemberExpression member = Expression.PropertyOrField(obj, "Id");
    
    
                BinaryExpression query = Expression.Equal(member, constant);
    
    
                var lambda = Expression.Lambda<Func<Model, bool>>(query, obj);
    
                var func = lambda.Compile();
                return func;
            }
    
            /// <summary>
            /// Model等于
            /// </summary>
            /// <param name="model"></param>
            /// <returns></returns>
            public Func<Model, bool> CreateFilterModel(Model model)
            {
                ParameterExpression obj = Expression.Parameter(typeof(Model), "obj");
    
                ConstantExpression constant = Expression.Constant(model.Id);
    
                MemberExpression member = Expression.PropertyOrField(obj, "Id");
    
    
                BinaryExpression query = Expression.Equal(member, constant);
    
    
                var lambda = Expression.Lambda<Func<Model, bool>>(query, obj);
    
                var func = lambda.Compile();
                return func;
            }
    
            /// <summary>
            /// Object 等于(1参数)
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="model"></param>
            /// <returns></returns>
            public Func<T, bool> CreateFilterObject<T>(T model) where T : class,new()
            {
                ParameterExpression obj = Expression.Parameter(typeof(T), "obj");
    
                var constVal = Convert.ToInt32(GetPropertyValue(model, "Id"));
                ConstantExpression constant = Expression.Constant(constVal);
    
                MemberExpression member = Expression.PropertyOrField(obj, "Id");
    
    
                BinaryExpression query = Expression.Equal(member, constant);
    
    
                var lambda = Expression.Lambda<Func<T, bool>>(query, obj);
    
                var func = lambda.Compile();
                return func;
            }
    
            /// <summary>
            /// Model等于(2参数)
            /// </summary>
            /// <returns></returns>
            public Func<Model, Model, bool> CreateModelEqual()
            {
                ParameterExpression obj = Expression.Parameter(typeof(Model), "obj");
    
    
                ParameterExpression obj1 = Expression.Parameter(typeof(Model), "obj1");
    
                MemberExpression member = Expression.PropertyOrField(obj, "Id");
    
                MemberExpression member1 = Expression.PropertyOrField(obj1, "Id");
    
                BinaryExpression query = Expression.Equal(member, member1);
    
    
                var lambda = Expression.Lambda<Func<Model, Model, bool>>(query, obj, obj1);
    
                var func = lambda.Compile();
                return func;
            }
    
            /// <summary>
            /// Int 等于
            /// </summary>
            /// <returns></returns>
            public Func<int, int, bool> CreateIntEqual()
            {
                ParameterExpression member = Expression.Parameter(typeof(int), "id");
    
                ParameterExpression val = Expression.Parameter(typeof(int), "val");
    
                BinaryExpression bin = Expression.Equal(member, val);
    
                var lambda = Expression.Lambda<Func<int, int, bool>>(bin, member, val);
    
                var func = lambda.Compile();
                return func;
            }
    
            #region Extend
    
            private object GetPropertyValue<T>(T model, string proertyName)
                where T : class
            {
                return model.GetType().GetProperty(proertyName).GetValue(model);
            }
            #endregion
    
        }
    
    
        public class Model
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }
    }
    static void TestLambda()
            {
    
                LambdaHelper helper = new LambdaHelper();
    
                Model test1 = new Model() { Id = 1, Name = "lcc1" };
                Model test2 = new Model() { Id = 2, Name = "lcc2" };
                Model test3 = new Model() { Id = 3, Name = "lcc3" };
    
    
                List<Model> list = new List<Model>() { test1, test2, test3 };
    
                //CreateFilterID
                Console.WriteLine("-----------------CreateFilterID--------------------------");
                var filterFunc = helper.CreateFilterID(1);
    
                Console.WriteLine("test1中的Id 等于1:" + filterFunc(test1));
                Console.WriteLine("test2中的Id 等于1:" + filterFunc(test1));
    
                //CreateFilterModel
                Console.WriteLine("--------------------CreateFilterModel---------------------");
                var filterModelFunc = helper.CreateFilterModel(test1);
                Console.WriteLine("test1中的等于test1:" + filterModelFunc(test1));
                Console.WriteLine("test1中的等于test2:" + filterModelFunc(test2));
                Console.WriteLine("list中的等于test1的数量:" + list.Where(filterModelFunc).Count());
    
                //CreateFilterObject
                Console.WriteLine("----------------------CreateFilterObject--------------------");
                var filterObjectlFunc = helper.CreateFilterObject(test2);
                Console.WriteLine("test2中的等于test1:" + filterObjectlFunc(test1));
                Console.WriteLine("test2中的等于test2:" + filterObjectlFunc(test2));
    
                Console.WriteLine("list中的等于test2的数量:" + list.Where(filterObjectlFunc).Count());
    
    
                //CreateModelEqual
                Console.WriteLine("-------------------CreateModelEqual--------------------------");
                var modelEqualFunc = helper.CreateModelEqual();
    
                Console.WriteLine("test1,test2是否相等:" + modelEqualFunc(test1, test2));
                Console.WriteLine("test1,test1是否相等:" + modelEqualFunc(test1, test2));
    
                //CreateIntEqual
                Console.WriteLine("-----------------CreateIntEqual------------------------------");
                var intEqualFunc = helper.CreateIntEqual();
                Console.WriteLine("1,2是否相等:" + intEqualFunc(1, 2));
                Console.WriteLine("1,1是否相等:" + intEqualFunc(1, 1));
    
                Console.Read();
    
    
            }

  • 相关阅读:
    .net String.Format数字格式化输出
    sql prompt5安装好了,也破解完成了,然后到SQL里面还是没有提示是为什么?
    DataSet筛选数据然后添加到新的DataSet中引发的一系列血案
    .net 时间戳互相转换(精确到毫秒)
    记录一次MVC 3.0错误 HTTP 404您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用。请检查以下 URL 并确保其拼写正确。
    IIS7部署项目时提示:"错误消息 401.2。: 未经授权: 服务器配置导致登录失败。"的解决办法
    IIS发布网站出现“未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。”的解决方法
    微信支付(APP)集成时碰到的问题(.net提示“无权限”、iOS跳转到微信支付页面中间只有一个“确定”按钮)
    由SpringMVC中RequetContextListener说起
    关于cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题(不需要修改任何代码,只需要一个配置)
  • 原文地址:https://www.cnblogs.com/shikyoh/p/5956490.html
Copyright © 2011-2022 走看看