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 = , Name = "lcc1" };
Model test2 = new Model() { Id = , Name = "lcc2" };
Model test3 = new Model() { Id = , Name = "lcc3" }; List<Model> list = new List<Model>() { test1, test2, test3 }; //CreateFilterID
Console.WriteLine("-----------------CreateFilterID--------------------------");
var filterFunc = helper.CreateFilterID(); 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(, ));
Console.WriteLine("1,1是否相等:" + intEqualFunc(, )); Console.Read(); }

Lambda动态创建的更多相关文章

  1. 动态创建Lambda表达式实现高级查询

    需求简介 最近这几天做的东西总算是回归咱的老本行了,给投资管理项目做一个台账的东西,就是类似我们的报表.其 中有一个功能是一个高级查询的需求,在查询条件方面大概有7.8个查询条件.需求就是如果一个条件 ...

  2. Python 动态创建函数【转】

    知乎上也有相似的问题 偶然碰到一个问题,初想是通过动态创建Python函数的方式来解决,于是调研了动态创建Python函数的方法. 定义lambda函数 在Python中定义lambda函数的写法很简 ...

  3. Python中使用type、metaclass动态创建方法和属性

    1: type() 我们知道动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Person的class: class Person(obj ...

  4. [C# Expression] 之动态创建表达式

    上一篇中说到了 Expression 的一些概念性东西,其实也是为了这一篇做知识准备.为了实现 EFCore 的多条件.连表查询,简化查询代码编写,也就有了这篇文章.   在一些管理后台中,对数据进行 ...

  5. JavaScript dom 动态创建标记

    此前的大多数DOM都是用来查找元素,getElementById和getElementsByTagName都可以方便快捷的找到文档中的某个或者某些特定的元素节点,这些元素随后可以用诸如setAttri ...

  6. ios动态创建类Class

    [Objective-C Runtime动态加载]---动态创建类Class 动态创建类Class,动态添加Class成员变量与成员函数,动态变量赋值与取值,动态函数调用等方法 a.使用objc_al ...

  7. winform 用户控件、 动态创建添加控件、timer控件、控件联动

    用户控件: 相当于自定义的一个panel 里面可以放各种其他控件,并可以在后台一下调用整个此自定义控件. 使用方法:在项目上右键.添加.用户控件,之后用户控件的编辑与普通容器控件类似.如果要在后台往窗 ...

  8. python动态创建类的声明

    动态创建类的声明 使用内置函数type,原型:class type(name, bases, dict)name是类的名字,相当于__class__bases是类的基类,元组,可以有多个基类,但是基类 ...

  9. WinForm用户控件、动态创建添加控件、timer控件--2016年12月12日

    好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3       0 0     用户控件: 通过布局将多个控件整合为一个控件,根据自己的需要进行修改,可对用户控件内的所有控件及控件属性进行修 ...

随机推荐

  1. paip.hibernate save 失败的解决

    paip.hibernate save 失败的解决   打开log  debug  level,,看不见insert 代码...     Hibernate select max(ID).txt   ...

  2. Leetcode 101 Symmetric Tree 二叉树

    判断一棵树是否自对称 可以回忆我们做过的Leetcode 100 Same Tree 二叉树和Leetcode 226 Invert Binary Tree 二叉树 先可以将左子树进行Invert B ...

  3. Windows Server 2012 如何实现多个用户远程桌面登陆?

    Windows Server 2012 如何实现多个用户远程桌面登陆?说明:Windows Server 2012默认情况下,只运行2个用户远程桌面登陆,这里我们可以通过安装远程桌面会话主机配置来实现 ...

  4. SSD性能对比

    SSD性能测试顺序写 16k iops 85061.08顺序写 8k iops 146250.93顺序写 4k iops 239816.69顺序写 2k iops 294540.87顺序写 1k io ...

  5. 分享一些无特征PHP一句话

    分享些不需要动态函数.不用eval.不含敏感函数.免杀免拦截的一句话.(少部分一句话需要php5.4.8+.或sqlite/pdo/yaml/memcached扩展等) 原理:https://www. ...

  6. Base: 一种 Acid 的替代方案

    原文链接: BASE: An Acid Alternative Pdf下载链接: Base 数据库 ACID,都不陌生:原子性.一致性.隔离性和持久性,这在单台服务器就能搞定的时代,很容易实现,但是到 ...

  7. clearfix清除浮动进化史

    我想大家在写CSS的时候应该都对清除浮动的用法深有体会,今天我们就还讨论下clearfix的进化史吧. clearfix清除浮动 首先在很多很多年以前我们常用的清除浮动是这样的. .clear{cle ...

  8. SQL 性能调优日常积累【转】

    阅读目录 (1)选择最有效率的表名顺序(只在基于规则的优化器中有效) (2)WHERE子句中的连接顺序 (3)SELECT子句中避免使用 ‘ * ‘ (4)减少访问数据库的次数 (5)在SQL*Plu ...

  9. C变量类型和作用域

    C语言中所有变量都有自己的作用域,申明变量的类型不同,其作用域也不同.C语言中的变量,按照作用域的范围可分为两种, 即局部变量和全局变量. 一.局部变量 局部变量也称为内部变量.局部变量是在函数内作定 ...

  10. SQLSERVER建立MYSQL连接服务器

    1. 在SQL SERVER端安装MYSQL的ODBC驱动 2. 在ODBC数据源添加MYSQL(控制面板\所有控制面板项\管理工具) 在用户DSN 和系统DSN添加配置驱动程序 注:字符集一定要和M ...