Expression表达式树 案例
1,Expression.Invoke
//运用委托或Lambda表达式
System.Linq.Expressions.Expression<Func<int, int, bool>> largeSumTest =(num1, num2) => (num1 + num2) > ;
System.Linq.Expressions.InvocationExpression invocationExpression =
System.Linq.Expressions.Expression.Invoke(
largeSumTest,
System.Linq.Expressions.Expression.Constant(),
System.Linq.Expressions.Expression.Constant());
Console.WriteLine(invocationExpression.ToString());//输出:Invoke((num1, num2) => ((num1 + num2) > 1000), 539, 281)
Console.WriteLine(Expression.Lambda<Func<bool>>(invocationExpression).Compile()());//计算委托 返回false
Console.ReadKey();
案例:
//执行1+2
var a = Expression.Add(Expression.Constant(), Expression.Constant());
var lambda = Expression.Lambda<Func<int>>(a).Compile();
Console.WriteLine(lambda());
//执行Math.Sin()
var p = Expression.Parameter(typeof(double), "a");
//Sin(a)
var exp = Expression.Call(null, typeof(Math).GetMethod("Sin", BindingFlags.Public | BindingFlags.Static), p);
//a=>Sin(a)
var l = Expression.Lambda<Func<double,double>>(exp, p).Compile();
Console.WriteLine(l());
//执行i => i委托
Expression<Func<int, int>> ex1 = i => i;
var paraemter = Expression.Parameter(typeof(int), "a");
Console.WriteLine(Expression.Lambda<Func<int, int>>(Expression.Invoke(ex1, paraemter), paraemter).Compile()());
//输出:((r.Name == "张三") AndAlso Invoke(r => (r.Sex == "男"), r))
Expression<Func<Product, bool>> where = r => r.Name == "张三";
Expression<Func<Product, bool>> where2 = r => r.Sex == "男";
var invoke = Expression.Invoke(where2, where.Parameters);
Console.WriteLine(invoke);
var and = Expression.AndAlso(where.Body, invoke);
Console.WriteLine(and);
using LinqKit;
//ef查询
DbContext db = new DbContext(ConfigurationManager.ConnectionStrings["blogEntities"].ConnectionString);
Expression<Func<products, bool>> where = r => true;
Expression<Func<products, bool>> wherename = r => r.Name == "asd";
where = Expression.Lambda<Func<products, bool>>(Expression.AndAlso(where.Body, Expression.Invoke(wherename,where.Parameters)), where.Parameters);
var ps = db.Set<products>().AsNoTracking().AsExpandable().Where(where).AsQueryable().ToList();
foreach (var item in ps)
{
Console.WriteLine($"id:{item.Id} qty:{item.Qty} name:{item.Name} aa:{item.AA}");
}
//执行Lambda r => r 输出:1
Expression<Func<int, int>> exr = r => r;
var invoke = Expression.Invoke(exr, Expression.Constant());
var d = Expression.Lambda(invoke).Compile();
Console.WriteLine(d.DynamicInvoke());
一、QueryFilter
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using System.Reflection; namespace QueryFilterComplete
{
public class QueryFilter
{ /// <summary>
/// 查询条件过滤
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <param name="valNames">需要过滤的字段</param>
/// <param name="vagueNames">需要模糊查询的字段</param>
/// <param name="isIgnoreZero">true:忽略0</param>
/// <returns></returns>
public static Expression<Func<T, Boolean>> Filter<T,Twhere>(Twhere t, IEnumerable<string> valNames, IEnumerable<string> vagueNames, bool isIgnoreZero = true) where T : class where Twhere:class
{
Expression<Func<T, Boolean>> e = r => true;
foreach (var item in valNames)
{
var result = GetFilterType(item, vagueNames);
if (result.Item1 == QFilterType.None) continue;
PropertyInfo property = typeof(Twhere).GetProperty(item);
var value = property.GetValue(t);
if (!Validate(property.PropertyType, value, isIgnoreZero)) continue; var rE = Expression.Parameter(typeof(T), "r");
var propertyE = Expression.Property(rE, result.Item2);
var valueE = Expression.Constant(value);
var lambda = Expression.Lambda<Func<T, Boolean>>(ComputeExpression(result.Item1, t, property, propertyE, valueE), rE);
var invoke = Expression.Invoke(lambda, e.Parameters);
e = Expression.Lambda<Func<T, Boolean>>(Expression.AndAlso(e.Body, invoke), e.Parameters);
}
return e;
}
private static bool Validate(Type t,object value, bool isIgnoreZero)
{
if (value == null) return false;
if (t.IsValueType)
{
if (t == typeof(DateTime)) return true;
if (t == typeof(bool)) return true;
if (Convert.ToDouble(value) == && isIgnoreZero) return false;
}
return true;
} //获取过滤类型
private static Tuple<QFilterType, string> GetFilterType(string valName, IEnumerable<string> vagueNames)
{
QFilterType type = QFilterType.None;
string propertyName = "";
if (string.IsNullOrEmpty(valName)) {
return Tuple.Create(type, propertyName);
}
type = QFilterType.Equal;
propertyName = valName;
if (valName.EndsWith("_ge"))
{
type = QFilterType.ge;
propertyName = valName.TrimEnd('_', 'g', 'e');
}
if (valName.EndsWith("_gt"))
{
type = QFilterType.gt;
propertyName = valName.TrimEnd('_', 'g', 't');
}
if (valName.EndsWith("_le"))
{
type = QFilterType.le;
propertyName = valName.TrimEnd('_', 'l', 'e');
}
if (valName.EndsWith("_lt"))
{
type = QFilterType.lt;
propertyName = valName.TrimEnd('_', 'l', 't');
}
if (valName.EndsWith("_ne"))
{
type = QFilterType.ne;
propertyName = valName.TrimEnd('_', 'n', 'e');
}
if (valName.EndsWith("_csv"))
{
type = QFilterType.csv;
propertyName = valName.TrimEnd('_', 'c', 's', 'v');
}
if (vagueNames!=null&&vagueNames.Contains(valName))
{
type = QFilterType.VaguesEqual;
propertyName = valName;
}
return Tuple.Create(type, propertyName);
}
private static Expression ComputeExpression<T>(QFilterType type,T t, PropertyInfo pInfo, Expression propertyE, Expression valueE)
{
if (type == QFilterType.Equal)
{
return Expression.Equal(propertyE, valueE);
}
if (type == QFilterType.VaguesEqual)
{
//Console.WriteLine(Expression.Call(typeof(Program), "VaguesEqual", null, p, value));
return Expression.Call(typeof(QueryFilter), "VaguesEqual", null, propertyE, valueE);
}
if (type == QFilterType.ge)
{
return Expression.GreaterThanOrEqual(propertyE, valueE);
}
if (type == QFilterType.gt)
{
return Expression.GreaterThan(propertyE, valueE);
}
if (type == QFilterType.le)
{
return Expression.LessThanOrEqual(propertyE, valueE);
}
if (type == QFilterType.lt)
{
return Expression.LessThan(propertyE, valueE);
}
if (type == QFilterType.ne)
{
return Expression.NotEqual(propertyE, valueE);
}
if (type == QFilterType.csv)
{
if (pInfo.PropertyType.GetGenericTypeDefinition()==typeof(IEnumerable<>) || pInfo.PropertyType.IsSubclassOf(typeof(IEnumerable<>)))
{
return Expression.Call(typeof(QueryFilter), "VaguesEqual", new Type[] { pInfo.PropertyType.GenericTypeArguments[] },Expression.Constant(pInfo.GetValue(t)), propertyE);
}
}
return null;
} private static bool VaguesEqual<T>(IEnumerable<T> t, T value)
{
return t.Contains(value);
}
//模糊匹配
private static bool VaguesEqual(string t, string value)
{
return t.Contains(value);
} }
}
下载地址v1:http://pan.baidu.com/s/1jI1I2MU
Expression表达式树 案例的更多相关文章
- 介绍一个可以将Expression表达式树解析成Transact-SQL的项目Expression2Sql
一.Expression2Sql介绍 Expression2Sql是一个可以将Expression表达式树解析成Transact-SQL的项目.简单易用,几分钟即可上手使用,因为博主在设计Expres ...
- 委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底
本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function&l ...
- .net 系列:Expression表达式树、lambda、匿名委托 的使用
首先定义一个泛型委托类型,如下: public delegate T Function<T>(T a, T b); 实现泛型委托的主体代码,并调用: public static strin ...
- .net 系列:Expression表达式树、lambda、匿名委托 的使用【转】
https://www.cnblogs.com/nicholashjh/p/7928205.html 首先定义一个泛型委托类型,如下: public delegate T Function<T& ...
- Expression表达式树(C#)
Lambda表达式: 1.下面举例通过Lambda表达式创建了一个用于验证Name的Func委托. //通过Lambda表达式创建一个对象的Name属性验证委托 Func<SearchInfo, ...
- .NET技术-6.0. Expression 表达式树 生成 Lambda
.NET技术-6.0. Expression 表达式树 生成 Lambda public static event Func<Student, bool> myevent; public ...
- Expression表达式树
表达式树表示树状数据结构的代码,树状结构中的每个节点都是一个表达式,例如一个方法调用或类似 x < y 的二元运算 1.利用 Lambda 表达式创建表达式树 Expression<Fun ...
- 关于Expression表达式树的拼接
最近在做项目中遇到一个问题,需求是这样的: 我要对已经存在的用户进行检索,可以根据用户的id 或者用户名其中的一部分字符来检索出来,这样就出现了三种情况 只有id,只有用户名中一部字符,或者全部都有. ...
- Expression 表达式树学习整理
整理了一下表达式树的一些东西,入门足够了 先从ConstantExpression 开始一步一步的来吧 它表示具有常量值的表达式 我们选建一个控制台应用程序 ConstantExpression _ ...
随机推荐
- 【leetcode 简单】 第一百零六题 压缩字符串
给定一组字符,使用原地算法将其压缩. 压缩后的长度必须始终小于或等于原数组长度. 数组的每个元素应该是长度为1 的字符(不是 int 整数类型). 在完成原地修改输入数组后,返回数组的新长度. 进阶: ...
- Java并发编程(4)--生产者与消费者模式介绍
一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就 ...
- 利用正则表达式去除所有html标签,只保留文字
后台将富文本编辑器中的内容返回到前端时如果带上了标签,这时就可以利用这种方法只保留文字. 标签的格式有以下几种 1.<div class="test"></div ...
- 洛谷 P4248: bzoj 3238: [AHOI2013]差异
题目传送门:洛谷 P4248. 题意简述: 定义两个字符串 \(S\) 和 \(T\) 的差异 \(\operatorname{diff}(S,T)\) 为这两个串的长度之和减去两倍的这两个串的最长公 ...
- 最短路径之迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- REX系统了解1
REX是高通开发出来的一个操作系统,起初它是为了在Inter 80186处理器上应用而开发的,到后来才转变成应用在ARM这种微处理器上.他历经了很多版本,代码也越来越多,功能也越来越完善.REX只用不 ...
- BZOJ 3510 - 首都 「 $LCT$ 动态维护树的重心」
这题 FlashHu 的优化思路值得借鉴 前置引理 树中所有点到某个点的距离和中,到重心的距离和是最小的. 把两棵树通过某一点相连得到一颗新的树,新的树的重心必然在连接原来两棵树重心的路径上. 一棵树 ...
- Genymotion上不能安装APK软件的问题
Genymotion模拟器不能安装APK的原因 官网给出的解释:Genymotion模拟器使用的是x86架构,在第三方市场上的应用有部分不采用x86这么一种架构,所以在编译的时候不通过,报“APP n ...
- 004_MAC实用的小工具
一.XtraFinder(右键菜单扩展) http://www.xuebuyuan.com/173454.html http://www.mamicode.com/info-detail-111618 ...
- Linux压缩打包方法连载之三:bzip2, bzcat 命令
Linux压缩打包方法有多种,本文集中讲解了bzip2, bzcat 命令的使用.案例说明,例如# 与 gzip 同样的,都是在计算压缩比的参数,-9 最佳,-1 最快. AD: 我们遇见Linux压 ...