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 用户控件: 通过布局将多个控件整合为一个控件,根据自己的需要进行修改,可对用户控件内的所有控件及控件属性进行修 ...
随机推荐
- atitit.提升软件开发效率大的总结O5
atitit.提升软件开发效率大的总结O5 #---平台化.组件化 1 #--cbb公用模块的建设 1 #---内部最佳流程方法跟实践的总结 2 #---内部知识体系的建设 2 #---问题Qa库的建 ...
- Linux中ctrl-c, ctrl-z, ctrl-d 区别
在Linux中: ctrl-c: ( kill foreground process ) 发送 SIGINT 信号给前台进程组中的所有进程,强制终止程序的执行: ctrl-z: ( suspend ...
- Linux命令入门
// 查看日历cal // 修改密码passwd // 查看目录和文件ls -lls // 查看当前用户信息whoami // 查看当前在线用户userswho 在Linux中,可以使用 vi 编辑器 ...
- bzoj 1858: [Scoi2010]序列操作
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...
- 负margin在布局中的运用
一.左右栏宽度固定,中间栏宽度自适应 <!DOCTYPE html> <html> <head lang="en"> <meta char ...
- Android BitmapShader 实战 实现圆形、圆角图片
转载自:http://blog.csdn.net/lmj623565791/article/details/41967509 1.概述 记得初学那会写过一篇博客Android 完美实现图片圆角和圆形( ...
- 安卓App流量统计
http://keepcleargas.bitbucket.org/2013/10/12/android-App-Traffic.html 安卓App流量统计 12 OCT 2013 android流 ...
- 如何获得WPA握手包&EWSA破解WPA密码教程[zz]
获得WPA\WPA2 握手包的方法有很多,下面介绍通过aircrack-ng工具包来载获握手数据包. 1.下载aircrack-ng工具包. 2.终端里输入 sudo airmon-ng start ...
- 深入学习golang(5)—接口
接口 概述 如果说goroutine和channel是Go并发的两大基石,那么接口是Go语言编程中数据类型的关键.在Go语言的实际编程中,几乎所有的数据结构都围绕接口展开,接口是Go语言中所有数据结构 ...
- Simple-RTMP-Server 服务器搭建
Simple-RTMP-Server 服务器搭建 1. 服务器镜像获取 github源码地址 git clone https://github.com/winlinvip/simple-rtmp-se ...