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.web数据绑定 下拉框的api设计 选择框 uapi python .net java swing jsf总结
paip.web数据绑定 下拉框的api设计 选择框 uapi python .net java swing jsf总结 ====总结: 数据绑定下拉框,Uapi 1.最好的是默认绑定..Map(k ...
- Leetcode 202 Happy Number 弗洛伊德判环解循环
今天先谈下弗洛伊德判环,弗洛伊德判环原来是在一个圈内有两人跑步,同时起跑,一人的速度是另一人的两倍,则那个人能在下一圈追上另一个人,弗洛伊德判环能解数字会循环出现的题,比如说判断一个链表是不是循环链表 ...
- Maven之问题解决汇总
Maven使用中,遇到的问题及解决办法记录下来 pom.xml顶部报错问题解决方法:http://stackoverflow.com/questions/5074063/maven-error-fai ...
- CSS水平垂直居中总结
行内元素水平居中 把行内元素包裹在块级父元素中,且父元素中的css设置text-align:center; <!DOCTYPE html> <html> <head> ...
- STM32 USB CAN 学习笔记 - 共享RAM的用法
USB 时钟可以一直使能. 如果CAN时钟没有使能,RAM 能被软件读写.(CANBus 不能发送和接受Message) 如果CAN时钟使能,RAM不能软件被写. CANBus Core 控制此RAM ...
- Windows中搭建已存在的Octopress环境
// 当我们需要在不同的电脑上来对同一个Octopress博客进行维护的时候就需要针对已存在的Octopress来设置环境了, 安装相应的软件 Git:http://msysgit.googlecod ...
- EWM一个仓库号对应ERP多个PLANT的配置
1. CIF多个DC到EWM系统,创建SCU并配置成仓 2. tx:/sapapo/loc3 对多个DC生成分配模型 3. IMG:分配仓库编号 去掉缺省的授权处理方 4. 维护SCU hierarc ...
- iOS crash 异常捕获
// // UncaughtExceptionHandler.m // UncaughtExceptions // // Created by Matt Gallagher on 2010/05 ...
- HashMap工作原理(转载)
转载自:http://www.importnew.com/7099.html HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用Hash ...
- [C#] zdbviewcs: 跨平台数据库查看器。支持SqlServer、Oracle、MySql等数据库
作者:zyl910 一.说明 本工具有适合以下情况使用—— * 快速查看数据库中数据及表结构信息.* 测试ADO.Net下连接字符串的写法.* 帮忙分析ADO.Net数据库操作. 二.用法 运行本程序 ...