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 = , 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动态创建的更多相关文章
- 动态创建Lambda表达式实现高级查询
需求简介 最近这几天做的东西总算是回归咱的老本行了,给投资管理项目做一个台账的东西,就是类似我们的报表.其 中有一个功能是一个高级查询的需求,在查询条件方面大概有7.8个查询条件.需求就是如果一个条件 ...
- Python 动态创建函数【转】
知乎上也有相似的问题 偶然碰到一个问题,初想是通过动态创建Python函数的方式来解决,于是调研了动态创建Python函数的方法. 定义lambda函数 在Python中定义lambda函数的写法很简 ...
- Python中使用type、metaclass动态创建方法和属性
1: type() 我们知道动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Person的class: class Person(obj ...
- [C# Expression] 之动态创建表达式
上一篇中说到了 Expression 的一些概念性东西,其实也是为了这一篇做知识准备.为了实现 EFCore 的多条件.连表查询,简化查询代码编写,也就有了这篇文章. 在一些管理后台中,对数据进行 ...
- JavaScript dom 动态创建标记
此前的大多数DOM都是用来查找元素,getElementById和getElementsByTagName都可以方便快捷的找到文档中的某个或者某些特定的元素节点,这些元素随后可以用诸如setAttri ...
- ios动态创建类Class
[Objective-C Runtime动态加载]---动态创建类Class 动态创建类Class,动态添加Class成员变量与成员函数,动态变量赋值与取值,动态函数调用等方法 a.使用objc_al ...
- winform 用户控件、 动态创建添加控件、timer控件、控件联动
用户控件: 相当于自定义的一个panel 里面可以放各种其他控件,并可以在后台一下调用整个此自定义控件. 使用方法:在项目上右键.添加.用户控件,之后用户控件的编辑与普通容器控件类似.如果要在后台往窗 ...
- python动态创建类的声明
动态创建类的声明 使用内置函数type,原型:class type(name, bases, dict)name是类的名字,相当于__class__bases是类的基类,元组,可以有多个基类,但是基类 ...
- WinForm用户控件、动态创建添加控件、timer控件--2016年12月12日
好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3 0 0 用户控件: 通过布局将多个控件整合为一个控件,根据自己的需要进行修改,可对用户控件内的所有控件及控件属性进行修 ...
随机推荐
- paip.hibernate save 失败的解决
paip.hibernate save 失败的解决 打开log debug level,,看不见insert 代码... Hibernate select max(ID).txt ...
- Leetcode 101 Symmetric Tree 二叉树
判断一棵树是否自对称 可以回忆我们做过的Leetcode 100 Same Tree 二叉树和Leetcode 226 Invert Binary Tree 二叉树 先可以将左子树进行Invert B ...
- Windows Server 2012 如何实现多个用户远程桌面登陆?
Windows Server 2012 如何实现多个用户远程桌面登陆?说明:Windows Server 2012默认情况下,只运行2个用户远程桌面登陆,这里我们可以通过安装远程桌面会话主机配置来实现 ...
- SSD性能对比
SSD性能测试顺序写 16k iops 85061.08顺序写 8k iops 146250.93顺序写 4k iops 239816.69顺序写 2k iops 294540.87顺序写 1k io ...
- 分享一些无特征PHP一句话
分享些不需要动态函数.不用eval.不含敏感函数.免杀免拦截的一句话.(少部分一句话需要php5.4.8+.或sqlite/pdo/yaml/memcached扩展等) 原理:https://www. ...
- Base: 一种 Acid 的替代方案
原文链接: BASE: An Acid Alternative Pdf下载链接: Base 数据库 ACID,都不陌生:原子性.一致性.隔离性和持久性,这在单台服务器就能搞定的时代,很容易实现,但是到 ...
- clearfix清除浮动进化史
我想大家在写CSS的时候应该都对清除浮动的用法深有体会,今天我们就还讨论下clearfix的进化史吧. clearfix清除浮动 首先在很多很多年以前我们常用的清除浮动是这样的. .clear{cle ...
- SQL 性能调优日常积累【转】
阅读目录 (1)选择最有效率的表名顺序(只在基于规则的优化器中有效) (2)WHERE子句中的连接顺序 (3)SELECT子句中避免使用 ‘ * ‘ (4)减少访问数据库的次数 (5)在SQL*Plu ...
- C变量类型和作用域
C语言中所有变量都有自己的作用域,申明变量的类型不同,其作用域也不同.C语言中的变量,按照作用域的范围可分为两种, 即局部变量和全局变量. 一.局部变量 局部变量也称为内部变量.局部变量是在函数内作定 ...
- SQLSERVER建立MYSQL连接服务器
1. 在SQL SERVER端安装MYSQL的ODBC驱动 2. 在ODBC数据源添加MYSQL(控制面板\所有控制面板项\管理工具) 在用户DSN 和系统DSN添加配置驱动程序 注:字符集一定要和M ...