ExpressionHelp2
public static class ExpressionHelp
{
private static Expression<T> Combine<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge)
{
MyExpressionVisitor visitor = new MyExpressionVisitor(first.Parameters[0]);
Expression bodyone = visitor.Visit(first.Body);
Expression bodytwo = visitor.Visit(second.Body);
return Expression.Lambda<T>(merge(bodyone, bodytwo), first.Parameters[0]);
}
/// <summary>
/// 条件合并,以and 的逻辑合并两个表达式
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="first"></param>
/// <param name="second"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> ExpressionAnd<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
{
return first.Combine(second, Expression.And);
}
/// <summary>
/// 条件合并,以or 的逻辑合并两个表达式
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="first"></param>
/// <param name="second"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> ExpressionOr<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
{
return first.Combine(second, Expression.Or);
}
/// <summary>
/// 查询语句,查询字段在 keywords中, 值为T 实体中与其对应的关键字包含值的数据。
/// </summary>
/// <typeparam name="T">实体类型 </typeparam>
/// <param name="item">实体</param>
/// <param name="Keywords">判断关键字</param>
/// <returns></returns>
public static Expression<Func<T, bool>> EntityEquel_Expression<T>(T item, List<string> Keywords)
{
Type entityType = typeof(T);
Expression<Func<T, bool>> expression = null;
ParameterExpression paramExpr = Expression.Parameter(typeof(T), "e");
foreach (var keyWord in Keywords)
{
Expression<Func<T, bool>> lambda;
string field = keyWord;//关键字
PropertyInfo proInfo = entityType.GetProperty(field);
var keyValue = proInfo.GetValue(item);
MemberExpression mExpr = Expression.Property(paramExpr, field);
ConstantExpression cExpr = Expression.Constant(keyValue, proInfo.PropertyType);
BinaryExpression bExpr = Expression.Equal(mExpr, cExpr);
Expression whereExpr = bExpr;
lambda = Expression.Lambda<Func<T, bool>>(whereExpr, paramExpr);
if (expression != null)
{
expression = expression.ExpressionAnd(lambda);
}
else
{
expression = lambda;
}
}
return expression;
}
/// <summary>
/// 包含查询关键字 是否包含在list中 相当于sql中的 select key in (设定的值)
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="KeyValues"> 数据判断 字段 ,string 为 实体内的某个字符,list<string> 为包含该字符的条件 </param>
/// <returns></returns>
public static Expression<Func<T, bool>> In_Expression<T>(Dictionary<string, List<string>> KeyValues)
{
Type entityType = typeof(T);
Expression<Func<T, bool>> expression = null;
ParameterExpression paramExpr = Expression.Parameter(typeof(T), "e");
foreach (var keyItem in KeyValues)
{
foreach (var keyValue in KeyValues[keyItem.Key])
{
Expression<Func<T, bool>> lambda;
string field = keyItem.Key;//关键字
PropertyInfo proInfo = entityType.GetProperty(field);
MemberExpression mExpr = Expression.Property(paramExpr, field);
ConstantExpression cExpr = Expression.Constant(keyValue, proInfo.PropertyType);
BinaryExpression bExpr = Expression.Equal(mExpr, cExpr);
Expression whereExpr = bExpr;
lambda = Expression.Lambda<Func<T, bool>>(whereExpr, paramExpr);
if (expression != null)
{
expression = expression.ExpressionOr(lambda);
}
else
{
expression = lambda;
}
}
}
return expression;
}
/// <summary>
/// 等于
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="key">关键字</param>
/// <param name="keyItem">关键字对应的值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> Equel_Expression<T>(string key, object keyItem)
{
Type entityType = typeof(T);
ParameterExpression paramExpr = Expression.Parameter(typeof(T), "e");
Expression<Func<T, bool>> lambda;
lambda = Equel128_GetExpression<T>(key, keyItem, true);
if (lambda != null)
{
return lambda;
}
string field = key;//关键字
PropertyInfo proInfo = entityType.GetProperty(field);
var keyValue = keyItem;
MemberExpression mExpr = Expression.Property(paramExpr, field);
ConstantExpression cExpr = Expression.Constant(keyValue, proInfo.PropertyType);
BinaryExpression bExpr = Expression.Equal(mExpr, cExpr);
Expression whereExpr = bExpr;
lambda = Expression.Lambda<Func<T, bool>>(whereExpr, paramExpr);
return lambda;
}
/// <summary>
/// 大于
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="key">关键字</param>
/// <param name="keyItem">关键字对应的值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> Greaterthan_Expression<T>(string key, object keyItem)
{
Type entityType = typeof(T);
ParameterExpression paramExpr = Expression.Parameter(typeof(T), "e");
Expression<Func<T, bool>> lambda;
string field = key;//关键字
PropertyInfo proInfo = entityType.GetProperty(field);
var keyValue = keyItem;
MemberExpression mExpr = Expression.Property(paramExpr, field);
ConstantExpression cExpr = Expression.Constant(keyValue, proInfo.PropertyType);
BinaryExpression bExpr = Expression.GreaterThan(mExpr, cExpr);
Expression whereExpr = bExpr;
lambda = Expression.Lambda<Func<T, bool>>(whereExpr, paramExpr);
return lambda;
}
/// <summary>
/// 大于等于
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="key">关键字</param>
/// <param name="keyItem">关键字对应的值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> GreaterThanOrEqual_Expression<T>(string key, object keyItem)
{
Type entityType = typeof(T);
ParameterExpression paramExpr = Expression.Parameter(typeof(T), "e");
Expression<Func<T, bool>> lambda;
string field = key;//关键字
PropertyInfo proInfo = entityType.GetProperty(field);
var keyValue = keyItem;
MemberExpression mExpr = Expression.Property(paramExpr, field);
ConstantExpression cExpr = Expression.Constant(keyValue, proInfo.PropertyType);
BinaryExpression bExpr = Expression.GreaterThanOrEqual(mExpr, cExpr);
Expression whereExpr = bExpr;
lambda = Expression.Lambda<Func<T, bool>>(whereExpr, paramExpr);
return lambda;
}
/// <summary>
/// 小于
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="key">关键字</param>
/// <param name="keyItem">关键字对应的值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> LessThan_Expression<T>(string key, object keyItem)
{
Type entityType = typeof(T);
ParameterExpression paramExpr = Expression.Parameter(typeof(T), "e");
Expression<Func<T, bool>> lambda;
string field = key;//关键字
PropertyInfo proInfo = entityType.GetProperty(field);
var keyValue = keyItem;
MemberExpression mExpr = Expression.Property(paramExpr, field);
ConstantExpression cExpr = Expression.Constant(keyValue, proInfo.PropertyType);
BinaryExpression bExpr = Expression.LessThan(mExpr, cExpr);
Expression whereExpr = bExpr;
lambda = Expression.Lambda<Func<T, bool>>(whereExpr, paramExpr);
return lambda;
}
/// <summary>
/// 小于等于
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="key">关键字</param>
/// <param name="keyItem">关键字对应的值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> LessThanOrEqual_Expression<T>(string key, object keyItem)
{
Type entityType = typeof(T);
ParameterExpression paramExpr = Expression.Parameter(typeof(T), "e");
Expression<Func<T, bool>> lambda;
string field = key;//关键字
PropertyInfo proInfo = entityType.GetProperty(field);
var keyValue = keyItem;
MemberExpression mExpr = Expression.Property(paramExpr, field);
ConstantExpression cExpr = Expression.Constant(keyValue, proInfo.PropertyType);
BinaryExpression bExpr = Expression.LessThanOrEqual(mExpr, cExpr);
Expression whereExpr = bExpr;
lambda = Expression.Lambda<Func<T, bool>>(whereExpr, paramExpr);
return lambda;
}
/// <summary>
/// 不等于
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="key">关键字</param>
/// <param name="keyItem">关键字对应的值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> NotEqual_Expression<T>(string key, object keyItem)
{
Type entityType = typeof(T);
ParameterExpression paramExpr = Expression.Parameter(typeof(T), "e");
Expression<Func<T, bool>> lambda;
lambda = Equel128_GetExpression<T>(key, keyItem, false);
if (lambda != null)
{
return lambda;
}
string field = key;//关键字
PropertyInfo proInfo = entityType.GetProperty(field);
var keyValue = keyItem;
MemberExpression mExpr = Expression.Property(paramExpr, field);
ConstantExpression cExpr = Expression.Constant(keyValue, proInfo.PropertyType);
BinaryExpression bExpr = Expression.NotEqual(mExpr, cExpr);
Expression whereExpr = bExpr;
lambda = Expression.Lambda<Func<T, bool>>(whereExpr, paramExpr);
return lambda;
}
#region 自定义字段
/// <summary>
///判断 decimal128 格式并进行处理
/// </summary>
/// <typeparam name="T">实体</typeparam>
/// <param name="name">关键字</param>
/// <param name="keyItem">值</param>
/// <param name="isEquel">是否相等 true等于 false 不等于</param>
/// <returns></returns>
private static Expression<Func<T, bool>> Equel128_GetExpression<T>(string name, object keyItem, bool isEquel)
{
Expression<Func<T, bool>> lambda = null;
Type entityType = typeof(T);
var param = Expression.Parameter(typeof(T), "x");
PropertyInfo proInfo = entityType.GetProperty(name);
var type = proInfo.PropertyType.FullName;
try
{
if (type.Contains("System.Decimal") && type != "System.Decimal")//包含但是不等于相当于 为decimal? 格式。否则相当于decimal格式
{
Decimal128 kk = Decimal128.Parse(keyItem.ToString());
BsonDecimal128 aa = new BsonDecimal128(kk);
ParameterExpression parameter = Expression.Parameter(typeof(T), "p");
MemberExpression member = Expression.PropertyOrField(parameter, name);
var addMethod = typeof(decimal?).GetMethod("Equals");
ConstantExpression constant = Expression.Constant(aa, typeof(BsonDecimal128));
if (isEquel)
{
lambda = Expression.Lambda<Func<T, bool>>(Expression.Call(member, addMethod, constant), parameter);
}
else
{
lambda = Expression.Lambda<Func<T, bool>>(Expression.Not(Expression.Call(member, addMethod, constant)), parameter);
}
}
}
catch (Exception ex)
{
lambda = null;
}
return lambda;
}
#endregion
}
public class MyExpressionVisitor : ExpressionVisitor
{
public ParameterExpression _Parameter { get; set; }
public MyExpressionVisitor(ParameterExpression Parameter)
{
_Parameter = Parameter;
}
protected override Expression VisitParameter(ParameterExpression p)
{
return _Parameter;
}
public override Expression Visit(Expression node)
{
return base.Visit(node);//Visit会根据VisitParameter()方法返回的Expression修改这里的node变量
}
}
ExpressionHelp2的更多相关文章
随机推荐
- Linux下屏幕亮度的调节
1 概述 Linux下的屏幕调节可以通过图形界面或者命令行进行调节,图形界面的话主要就是在设置中进行调节,如果设置中没有相应的选项可以进行手动调节. 2 手动调节 2.1 手动屏幕调节 亮度由ACPI ...
- linux 更新python3.8
1 下载源码 地址 选版本下载即可,目前最新为3.8.2版本. 2 解压 tar -zxvf Python-3.8.2.tgz cd Python-3.8.2 3 新建安装目录 安装目录在/usr/l ...
- day12.函数其它与模块1
一.函数递归 函数的递归调用:是函数嵌套调用的一种特殊形式 具体指的是在调用一个函数的过程中又直接或者间接地调用自己,称之为函数的递归调用 函数的递归调用其实就是用函数实现的循环 # def f1() ...
- istio之envoy常见术语及状态码
基本术语 Downstream(下游):下游主机连接到 Envoy,发送请求并接收响应,即发送请求的主机. Upstream(上游):上游主机接收来自 Envoy 的连接和请求,并返回响应,即接受请求 ...
- 906. Super Palindromes
Let's say a positive integer is a superpalindrome if it is a palindrome, and it is also the square o ...
- Ball
玉 図のように二股に分かれている容器があります.1 から 10 までの番号が付けられた10 個の玉を容器の開口部 A から落とし.左の筒 B か右の筒 C に玉を入れます.板 D は支点 E を中心に ...
- jquery里面.length和.size()有什么区别
区别: 1.针对标签对象元素,比如数html页面有多少个段落元素<p></p>,那么此时的$("p").size()==$("p").l ...
- Android 面试必备 - 系统、App、Activity 启动过程“一锅端”
Android 系统启动过程 从系统层看: linux 系统层 Android系统服务层 Zygote 从开机启动到Home Launcher: 启动bootloader (小程序:初始化硬件) 加载 ...
- 用最容易的方式学会单链表(Python实现)
单链表与数组 在本博客中,我们介绍单链表这种数据结构,链表结构为基于数组的序列提供了另一种选择(例如Python列表). 基于数组的序列也会有如下缺点: 一个动态数组的长度可能超过实际存储数组元素所需 ...
- SpringBoot学习笔记:Spring Data Jpa的使用
更多请关注公众号 Spring Data Jpa 简介 JPA JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(JSR ...