first commit

This commit is contained in:
2026-09-02 16:31:50 +08:00
commit a461727193
911 changed files with 692450 additions and 0 deletions
@@ -0,0 +1,79 @@
using System;
using System.Linq.Expressions;
namespace JSMachine.WMS.Infrastructure.LambdaHelp
{
public static class ExpressionExtension
{
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
{
if (expr1 == null)
return expr2;
else if (expr2 == null)
return expr1;
//return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expr1.Body, expr2.Body), expr1.Parameters);
ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");
NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter);
var left = visitor.Replace(expr1.Body);
var right = visitor.Replace(expr2.Body);
var body = Expression.And(left, right);
return Expression.Lambda<Func<T, bool>>(body, newParameter);
}
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
{
if (expr1 == null)
return expr2;
else if (expr2 == null)
return expr1;
ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");
NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter);
var left = visitor.Replace(expr1.Body);
var right = visitor.Replace(expr2.Body);
var body = Expression.Or(left, right);
return Expression.Lambda<Func<T, bool>>(body, newParameter);
}
//与拼接
public static Expression<Func<T, bool>> AndAlso<T>(this Expression<Func<T, bool>> a, Expression<Func<T, bool>> b)
{
var p = Expression.Parameter(typeof(T), "p");
var bd = Expression.AndAlso(
Expression.Invoke(a, p),
Expression.Invoke(b, p));
var ld = Expression.Lambda<Func<T, bool>>(bd, p);
return ld;
}
//或拼接
public static Expression<Func<T, bool>> Orelse<T>(this Expression<Func<T, bool>> a, Expression<Func<T, bool>> b)
{
var p = Expression.Parameter(typeof(T), "p");
var bd = Expression.OrElse(
Expression.Invoke(a, p),
Expression.Invoke(b, p));
var ld = Expression.Lambda<Func<T, bool>>(bd, p);
return ld;
}
}
internal class NewExpressionVisitor : ExpressionVisitor
{
public ParameterExpression _NewParameter { get; private set; }
public NewExpressionVisitor(ParameterExpression param)
{
this._NewParameter = param;
}
public Expression Replace(Expression exp)
{
return this.Visit(exp);
}
protected override Expression VisitParameter(ParameterExpression node)
{
return this._NewParameter;
}
}
}
@@ -0,0 +1,438 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq.Expressions;
using System.Reflection;
namespace JSMachine.WMS.Infrastructure.LambdaHelp
{
public static class ExpressionTreeHelper<T>
{
/// <summary>
/// 创建lambda表达式:p=>p == null
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> Null(string propertyName)
{
return p => p.GetType().GetProperty(propertyName).GetValue(p) == null;
}
/// <summary>
/// 创建lambda表达式:p=>true
/// </summary>p != null
/// <typeparam name="T"></typeparam>
/// <returns></returns>zhangsansss
public static Expression<Func<T, bool>> NotNull(string propertyName)
{
return p => p.GetType().GetProperty(propertyName).GetValue(p) != null;
}
/// <summary>
/// 创建lambda表达式:p=>true
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> True()
{
return p => true;
}
/// <summary>
/// 创建lambda表达式:p=>false
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> False()
{
return p => false;
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TKey"></typeparam>
/// <param name="sort"></param>
/// <returns></returns>
public static Expression<Func<T, TKey>> GetOrderExpression<TKey>(string propertyName)
{
ParameterExpression param = Expression.Parameter(typeof(T), "t");
return Expression.Lambda<Func<T, TKey>>
(
Expression.Convert(Expression.Property(param, propertyName),
typeof(object)),
param
);
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName == propertyValue
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="column"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> CreateEqual(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
Type type = typeof(T).GetProperty(propertyName).PropertyType;
if (!UnifyParamType(type, ref propertyValue))
{
return False();
}
////Type type = typeof(T).GetProperty(propertyName).PropertyType;
////propertyValue = propertyValue.ToString();
////propertyValue = Convert.ChangeType(propertyValue, type);
//ParameterExpression parameter = Expression.Parameter(typeof(T), "t");//创建参数p
//MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
//ConstantExpression constant = Expression.Constant(propertyValue);//创建常数
//return MyEqual(member, constant, parameter);
//propertyValue = propertyValue.ToString();
//propertyValue = Convert.ChangeType(propertyValue, type);
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");//创建参数p
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
ConstantExpression constant = Expression.Constant(propertyValue);//创建常数
//return Expression.Lambda<Func<T, bool>>(Expression.Equal(member, constant), parameter);
return MyEqual(member,constant,parameter);
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName != propertyValue
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="propertyName"></param>
/// <param name="propertyValue"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> CreateNotEqual(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
Type type = typeof(T).GetProperty(propertyName).PropertyType;
propertyValue = Convert.ChangeType(propertyValue, type);
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");//创建参数p
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
ConstantExpression constant = Expression.Constant(propertyValue);//创建常数
return Expression.Lambda<Func<T, bool>>(Expression.NotEqual(member, constant), parameter);
}
/// <summary>
/// 创建lambda表达式: p=>propertyValue.Contains(p.propertyName) 目前仅支持 List<string>类型,后期完善
/// </summary>
/// <param name="propertyName"></param>
/// <param name="propertyValue"></param>
/// <returns></returns>
internal static Expression<Func<T, bool>> GetIn(string propertyName, object propertyValue)
{
//目前仅支持 List<string>类型,后期完善
try
{
//使用Newtonsoft的ToObject方法将JArray转换成List<string>类型
List<string> lst = ((dynamic)propertyValue).ToObject<List<string>>();
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
MethodInfo method = typeof(List<string>).GetMethod("Contains", new[] { typeof(string) });
ConstantExpression constant = Expression.Constant(lst, typeof(List<string>));
return Expression.Lambda<Func<T, bool>>(Expression.Call(constant, method, member), parameter);
}
catch (Exception ex)
{
throw new Exception("查询的参数不合法,无法解析成表达式目录树");
}
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName > propertyValue
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="column"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> CreateGreaterThan(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
UnifyParamType(typeof(T).GetProperty(propertyName).PropertyType, ref propertyValue);
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");//创建参数p
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
ConstantExpression constant = Expression.Constant(propertyValue);//创建常数
return MyGreaterThan(member, constant, parameter);
//return Expression.Lambda<Func<T, bool>>(Expression.GreaterThan(member, constant), parameter);
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName < propertyValue
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="column"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> CreateLessThan(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
UnifyParamType(typeof(T).GetProperty(propertyName).PropertyType, ref propertyValue);
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");//创建参数p
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
ConstantExpression constant = Expression.Constant(propertyValue);//创建常数
return MyLessThan(member, constant, parameter);
//return Expression.Lambda<Func<T, bool>>(Expression.LessThan(member, constant), parameter);
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName >= propertyValue
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="column"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> CreateGreaterThanOrEqual(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
UnifyParamType(typeof(T).GetProperty(propertyName).PropertyType, ref propertyValue);
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");//创建参数p
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
ConstantExpression constant = Expression.Constant(propertyValue);//创建常数
return MyGreaterThanOrEqual(member, constant, parameter);
//return Expression.Lambda<Func<T, bool>>(Expression.GreaterThanOrEqual(member, constant), parameter);
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName <= propertyValue
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="column"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> CreateLessThanOrEqual(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
UnifyParamType(typeof(T).GetProperty(propertyName).PropertyType, ref propertyValue);
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");//创建参数p
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
ConstantExpression constant = Expression.Constant(propertyValue);//创建常数
return MyLessThanOrEqual(member, constant, parameter);
//return Expression.Lambda<Func<T, bool>>(Expression.LessThanOrEqual(member, constant), parameter);
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName.Contains(propertyValue)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="column"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> GetContains(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
Type type = typeof(T).GetProperty(propertyName).PropertyType;
if (!UnifyParamType(type, ref propertyValue))
{
return False();
}
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
ConstantExpression constant = Expression.Constant(propertyValue, typeof(string));
return Expression.Lambda<Func<T, bool>>(Expression.Call(member, method, constant), parameter);
}
/// <summary>
/// 创建lambda表达式:!(p=>p.propertyName.Contains(propertyValue))
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="column"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> GetNotContains(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
ConstantExpression constant = Expression.Constant(propertyValue, typeof(string));
return Expression.Lambda<Func<T, bool>>(Expression.Not(Expression.Call(member, method, constant)), parameter);
}
/// <summary>
/// 创建lambda表达式:!(p=>p.propertyName.StartsWith(propertyValue))
/// </summary>
/// <param name="propertyName"></param>
/// <param name="propertyValue"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> GetStartsWith(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
MethodInfo method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });
ConstantExpression constant = Expression.Constant(propertyValue, typeof(string));
return Expression.Lambda<Func<T, bool>>(Expression.Not(Expression.Call(member, method, constant)), parameter);
}
/// <summary>
/// 创建lambda表达式:!(p=>p.propertyName.EndsWith(propertyValue))
/// </summary>
/// <param name="propertyName"></param>
/// <param name="propertyValue"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> GetEndsWith(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
MethodInfo method = typeof(string).GetMethod("EndsWith", new[] { typeof(string) });
ConstantExpression constant = Expression.Constant(propertyValue, typeof(string));
return Expression.Lambda<Func<T, bool>>(Expression.Not(Expression.Call(member, method, constant)), parameter);
}
/// <summary>
/// 统一参数类型(值大小比较方法中只支持int和DateTime类型,但上端传递过来的参数有可能为string类型,故需要使用反射的方式统一参数类型)
/// </summary>
/// <returns></returns>
private static bool UnifyParamType(Type type, ref object param)
{
//如果类型转换失败,说明无法转换,比如将字符串 aaa转换为 int类型等
try
{
if (IsNullableType(type))
{
NullableConverter nullableConverter = new(type);
param = nullableConverter.ConvertFromString(param.ToString());
}
else
{
//if (type != param.GetType())
param = Convert.ChangeType(param, type);
}
return true;
}
catch (Exception ex)
{
return false;
throw ex;
}
}
/// <summary>
/// 判断可空类型
/// </summary>
/// <param name="theType"></param>
/// <returns></returns>
private static bool IsNullableType(Type theType)
{
return (theType.IsGenericType && theType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)));
}
/// <summary>
/// 自定义小于比较
/// </summary>
/// <param name="e1"></param>
/// <param name="e2"></param>
/// <param name="parameter"></param>
/// <returns></returns>
private static Expression<Func<T, bool>> MyGreaterThan(Expression e1, Expression e2, ParameterExpression parameter)
{
if (IsNullableType(e1.Type) && !IsNullableType(e2.Type))
e2 = Expression.Convert(e2, e1.Type);
else if (!IsNullableType(e1.Type) && IsNullableType(e2.Type))
e1 = Expression.Convert(e1, e2.Type);
return Expression.Lambda<Func<T, bool>>(Expression.GreaterThan(e1, e2), parameter);
}
private static Expression<Func<T,bool>> MyEqual(Expression e1,Expression e2, ParameterExpression parameter)
{
if (IsNullableType(e1.Type) && !IsNullableType(e2.Type))
e2 = Expression.Convert(e2, e1.Type);
else if (!IsNullableType(e1.Type) && IsNullableType(e2.Type))
e1 = Expression.Convert(e1, e2.Type);
return Expression.Lambda<Func<T, bool>>(Expression.Equal(e1, e2), parameter);
}
private static Expression<Func<T, bool>> MyContains(Expression e1, Expression e2, ParameterExpression parameter)
{
if (IsNullableType(e1.Type) && !IsNullableType(e2.Type))
e2 = Expression.Convert(e2, e1.Type);
else if (!IsNullableType(e1.Type) && IsNullableType(e2.Type))
e1 = Expression.Convert(e1, e2.Type);
return Expression.Lambda<Func<T, bool>>(Expression.Equal(e1, e2), parameter);
}
/// <summary>
/// 自定义大于比较
/// </summary>
/// <param name="e1"></param>
/// <param name="e2"></param>
/// <param name="parameter"></param>
/// <returns></returns>
private static Expression<Func<T, bool>> MyLessThan(Expression e1, Expression e2, ParameterExpression parameter)
{
if (IsNullableType(e1.Type) && !IsNullableType(e2.Type))
e2 = Expression.Convert(e2, e1.Type);
else if (!IsNullableType(e1.Type) && IsNullableType(e2.Type))
e1 = Expression.Convert(e1, e2.Type);
return Expression.Lambda<Func<T, bool>>(Expression.LessThan(e1, e2), parameter);
}
/// <summary>
/// 自定义大于等于比较
/// </summary>
/// <param name="e1"></param>
/// <param name="e2"></param>
/// <param name="parameter"></param>
/// <returns></returns>
private static Expression<Func<T, bool>> MyGreaterThanOrEqual(Expression e1, Expression e2, ParameterExpression parameter)
{
if (IsNullableType(e1.Type) && !IsNullableType(e2.Type))
e2 = Expression.Convert(e2, e1.Type);
else if (!IsNullableType(e1.Type) && IsNullableType(e2.Type))
e1 = Expression.Convert(e1, e2.Type);
return Expression.Lambda<Func<T, bool>>(Expression.GreaterThanOrEqual(e1, e2), parameter);
}
/// <summary>
/// 自定义小于等于比较
/// </summary>
/// <param name="e1"></param>
/// <param name="e2"></param>
/// <param name="parameter"></param>
/// <returns></returns>
private static Expression<Func<T, bool>> MyLessThanOrEqual(Expression e1, Expression e2, ParameterExpression parameter)
{
if (IsNullableType(e1.Type) && !IsNullableType(e2.Type))
e2 = Expression.Convert(e2, e1.Type);
else if (!IsNullableType(e1.Type) && IsNullableType(e2.Type))
e1 = Expression.Convert(e1, e2.Type);
return Expression.Lambda<Func<T, bool>>(Expression.LessThanOrEqual(e1, e2), parameter);
}
}
}
@@ -0,0 +1,45 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace JSMachine.WMS.Infrastructure.LambdaHelp
{
public class FilterCollection : Collection<IList<Filter>>
{
public FilterCollection() : base()
{ }
public FilterCollection(IList<IList<Filter>> lst) : base(lst)
{
}
}
public class Filter
{
public string PropertyName { get; set; }
public Op Operation { get; set; }
public object Value { get; set; }
}
public enum Op
{
NULL = 0,
NOTNUL = 1,
//查询List<string>类型的,当Count=0的时候选中(仅在MongoDB中有效)
Empty = 2,
//查询List<string>类型的,当Count>0的时候选中(仅在MongoDB中有效)
NotEmpty = 3,
Equals = 4,
NotEquals = 5,
GreaterThan = 6,
LessThan = 7,
GreaterThanOrEqual = 8,
LessThanOrEqual = 9,
Contains = 10,
NotContains = 11,
StartsWith = 12,
EndsWith = 13,
//包含查询,目前仅支持List<string>
In = 14
}
}
@@ -0,0 +1,78 @@
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
namespace JSMachine.WMS.Infrastructure.LambdaHelp
{
public static class LambdaBuider<T>
{
public static Expression<Func<T, bool>> BuildExpreesion(FilterCollection filters)
{
Expression<Func<T, bool>> baseExpression = t => false;
if (filters == null || filters.Count == 0)
return t => true;
List<Expression<Func<T, bool>>> orExpressions = new List<Expression<Func<T, bool>>>();
for (int i = 0; i < filters.Count; i++)
{
for (int j = 0; j < filters[i].Count; j++)
{
string propName = filters[i][j].PropertyName;
object value = filters[i][j].Value;
switch (filters[i][j].Operation)
{
case Op.NULL:
{
if (typeof(T).GetProperty(propName).PropertyType == typeof(int) || typeof(T).GetProperty(propName) == typeof(long))
{
baseExpression = baseExpression.Or(LambdaHelper<T>.CreateEqual(propName, 0));
}
else
{
baseExpression = baseExpression.Or(LambdaHelper<T>.Null(propName));
}
}; break;
case Op.NOTNUL:
{
if (typeof(T).GetProperty(propName).PropertyType == typeof(int) || typeof(T).GetProperty(propName) == typeof(long))
{
baseExpression = baseExpression.Or(LambdaHelper<T>.CreateNotEqual(propName, 0));
}
else
{
baseExpression = baseExpression.Or(LambdaHelper<T>.NotNull(propName));
}
}; break;
case Op.Equals: baseExpression = baseExpression.Or(LambdaHelper<T>.CreateEqual(propName, value)); break;
case Op.NotEquals: baseExpression = baseExpression.Or(LambdaHelper<T>.CreateNotEqual(propName, value)); break;
case Op.GreaterThan: baseExpression = baseExpression.Or(LambdaHelper<T>.CreateGreaterThan(propName, value)); break;
case Op.LessThan: baseExpression = baseExpression.Or(LambdaHelper<T>.CreateLessThan(propName, value)); break;
case Op.GreaterThanOrEqual: baseExpression = baseExpression.Or(LambdaHelper<T>.CreateGreaterThanOrEqual(propName, value)); break;
case Op.LessThanOrEqual: baseExpression = baseExpression.Or(LambdaHelper<T>.CreateLessThanOrEqual(propName, value)); break;
case Op.Contains: baseExpression = baseExpression.Or(LambdaHelper<T>.GetContains(propName, value)); break;
case Op.NotContains: baseExpression = baseExpression.Or(LambdaHelper<T>.GetNotContains(propName, value)); break;
case Op.StartsWith: baseExpression = baseExpression.Or(LambdaHelper<T>.GetStartsWith(propName, value)); break;
case Op.EndsWith: baseExpression = baseExpression.Or(LambdaHelper<T>.GetEndsWith(propName, value)); break;
case Op.In: baseExpression = baseExpression.Or(LambdaHelper<T>.GetIn(propName, value)); break;
}
}
orExpressions.Add(baseExpression);
baseExpression = p => false;
}
Expression<Func<T, bool>> resultExpression = p => true;
orExpressions.ForEach(x =>
{
resultExpression = resultExpression.And(x);
});
return resultExpression;
}
}
}
@@ -0,0 +1,388 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq.Expressions;
using System.Reflection;
namespace JSMachine.WMS.Infrastructure.LambdaHelp
{
public static class LambdaHelper<T>
{
/// <summary>
/// 创建lambda表达式:p=>p == null
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> Null(string propertyName)
{
return p => p.GetType().GetProperty(propertyName).GetValue(p) == null;
}
/// <summary>
/// 创建lambda表达式:p=>true
/// </summary>p != null
/// <typeparam name="T"></typeparam>
/// <returns></returns>zhangsansss
public static Expression<Func<T, bool>> NotNull(string propertyName)
{
return p => p.GetType().GetProperty(propertyName).GetValue(p) != null;
}
/// <summary>
/// 创建lambda表达式:p=>true
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> True()
{
return p => true;
}
/// <summary>
/// 创建lambda表达式:p=>false
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static Expression<Func<T, bool>> False()
{
return p => false;
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TKey"></typeparam>
/// <param name="sort"></param>
/// <returns></returns>
public static Expression<Func<T, TKey>> GetOrderExpression<TKey>(string propertyName)
{
ParameterExpression param = Expression.Parameter(typeof(T), "t");
//MemberExpression body = Expression.Property(param, propertyName);
//return Expression.Lambda<Func<T, TKey>>(Expression.Convert(body, typeof(T).GetProperty(propertyName).PropertyType));
return
Expression.Lambda<Func<T, TKey>>(
Expression.Convert(
Expression.Property(param, propertyName),
typeof(object)),
param);
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName == propertyValue
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="column"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> CreateEqual(string propertyName, object propertyValue)
{
var type = typeof(T).GetProperty(propertyName).PropertyType;
propertyValue = propertyValue.ToString();
propertyValue = Convert.ChangeType(propertyValue, type);
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");//创建参数p
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
ConstantExpression constant = Expression.Constant(propertyValue);//创建常数
return Expression.Lambda<Func<T, bool>>(Expression.Equal(member, constant), parameter);
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName != propertyValue
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="propertyName"></param>
/// <param name="propertyValue"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> CreateNotEqual(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
var type = typeof(T).GetProperty(propertyName).PropertyType;
propertyValue = Convert.ChangeType(propertyValue, type);
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");//创建参数p
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
ConstantExpression constant = Expression.Constant(propertyValue);//创建常数
return Expression.Lambda<Func<T, bool>>(Expression.NotEqual(member, constant), parameter);
}
/// <summary>
/// 创建lambda表达式: p=>propertyValue.Contains(p.propertyName) 目前仅支持 List<string>类型,后期完善
/// </summary>
/// <param name="propertyName"></param>
/// <param name="propertyValue"></param>
/// <returns></returns>
internal static Expression<Func<T, bool>> GetIn(string propertyName, object propertyValue)
{
//目前仅支持 List<string>类型,后期完善
try
{
//使用Newtonsoft的ToObject方法将JArray转换成List<string>类型
List<string> lst = ((dynamic)propertyValue).ToObject<List<string>>();
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
MethodInfo method = typeof(List<string>).GetMethod("Contains", new[] { typeof(string) });
ConstantExpression constant = Expression.Constant(lst, typeof(List<string>));
return Expression.Lambda<Func<T, bool>>(Expression.Call(constant, method, member), parameter);
}
catch (Exception ex)
{
throw new Exception("查询的参数不合法,无法解析成表达式目录树");
}
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName > propertyValue
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="column"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> CreateGreaterThan(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
UnifyParamType(typeof(T).GetProperty(propertyName).PropertyType, ref propertyValue);
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");//创建参数p
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
ConstantExpression constant = Expression.Constant(propertyValue);//创建常数
return MyGreaterThan(member, constant, parameter);
//return Expression.Lambda<Func<T, bool>>(Expression.GreaterThan(member, constant), parameter);
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName < propertyValue
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="column"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> CreateLessThan(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
UnifyParamType(typeof(T).GetProperty(propertyName).PropertyType, ref propertyValue);
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");//创建参数p
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
ConstantExpression constant = Expression.Constant(propertyValue);//创建常数
return MyLessThan(member, constant, parameter);
//return Expression.Lambda<Func<T, bool>>(Expression.LessThan(member, constant), parameter);
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName >= propertyValue
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="column"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> CreateGreaterThanOrEqual(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
UnifyParamType(typeof(T).GetProperty(propertyName).PropertyType, ref propertyValue);
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");//创建参数p
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
ConstantExpression constant = Expression.Constant(propertyValue);//创建常数
return MyGreaterThanOrEqual(member, constant, parameter);
//return Expression.Lambda<Func<T, bool>>(Expression.GreaterThanOrEqual(member, constant), parameter);
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName <= propertyValue
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="column"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> CreateLessThanOrEqual(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
UnifyParamType(typeof(T).GetProperty(propertyName).PropertyType, ref propertyValue);
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");//创建参数p
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
ConstantExpression constant = Expression.Constant(propertyValue);//创建常数
return MyLessThanOrEqual(member, constant, parameter);
//return Expression.Lambda<Func<T, bool>>(Expression.LessThanOrEqual(member, constant), parameter);
}
/// <summary>
/// 创建lambda表达式:p=>p.propertyName.Contains(propertyValue)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="column"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> GetContains(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
ConstantExpression constant = Expression.Constant(propertyValue, typeof(string));
return Expression.Lambda<Func<T, bool>>(Expression.Call(member, method, constant), parameter);
}
/// <summary>
/// 创建lambda表达式:!(p=>p.propertyName.Contains(propertyValue))
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="column"></param>
/// <param name="value"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> GetNotContains(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
ConstantExpression constant = Expression.Constant(propertyValue, typeof(string));
return Expression.Lambda<Func<T, bool>>(Expression.Not(Expression.Call(member, method, constant)), parameter);
}
/// <summary>
/// 创建lambda表达式:!(p=>p.propertyName.StartsWith(propertyValue))
/// </summary>
/// <param name="propertyName"></param>
/// <param name="propertyValue"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> GetStartsWith(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
MethodInfo method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });
ConstantExpression constant = Expression.Constant(propertyValue, typeof(string));
return Expression.Lambda<Func<T, bool>>(Expression.Not(Expression.Call(member, method, constant)), parameter);
}
/// <summary>
/// 创建lambda表达式:!(p=>p.propertyName.EndsWith(propertyValue))
/// </summary>
/// <param name="propertyName"></param>
/// <param name="propertyValue"></param>
/// <returns></returns>
public static Expression<Func<T, bool>> GetEndsWith(string propertyName, object propertyValue)
{
propertyValue = propertyValue.ToString();
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
MethodInfo method = typeof(string).GetMethod("EndsWith", new[] { typeof(string) });
ConstantExpression constant = Expression.Constant(propertyValue, typeof(string));
return Expression.Lambda<Func<T, bool>>(Expression.Not(Expression.Call(member, method, constant)), parameter);
}
/// <summary>
/// 统一参数类型(值大小比较方法中只支持int和DateTime类型,但上端传递过来的参数有可能为string类型,故需要使用反射的方式统一参数类型)
/// </summary>
/// <returns></returns>
private static void UnifyParamType(Type type, ref object param)
{
//param = type.GetMethod("Parse", new Type[] { typeof(string) }).Invoke(param, new object[] { param.ToString() });
if (IsNullableType(type))
{
NullableConverter nullableConverter = new(type);
param = nullableConverter.ConvertFromString(param.ToString());
}
else
{
param = Convert.ChangeType(param, type);
}
}
/// <summary>
/// 判断可空类型
/// </summary>
/// <param name="theType"></param>
/// <returns></returns>
private static bool IsNullableType(Type theType)
{
return (theType.IsGenericType && theType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)));
}
/// <summary>
/// 自定义小于比较
/// </summary>
/// <param name="e1"></param>
/// <param name="e2"></param>
/// <param name="parameter"></param>
/// <returns></returns>
private static Expression<Func<T, bool>> MyGreaterThan(Expression e1, Expression e2, ParameterExpression parameter)
{
if (IsNullableType(e1.Type) && !IsNullableType(e2.Type))
e2 = Expression.Convert(e2, e1.Type);
else if (!IsNullableType(e1.Type) && IsNullableType(e2.Type))
e1 = Expression.Convert(e1, e2.Type);
return Expression.Lambda<Func<T, bool>>(Expression.GreaterThan(e1, e2), parameter);
}
/// <summary>
/// 自定义大于比较
/// </summary>
/// <param name="e1"></param>
/// <param name="e2"></param>
/// <param name="parameter"></param>
/// <returns></returns>
private static Expression<Func<T, bool>> MyLessThan(Expression e1, Expression e2, ParameterExpression parameter)
{
if (IsNullableType(e1.Type) && !IsNullableType(e2.Type))
e2 = Expression.Convert(e2, e1.Type);
else if (!IsNullableType(e1.Type) && IsNullableType(e2.Type))
e1 = Expression.Convert(e1, e2.Type);
return Expression.Lambda<Func<T, bool>>(Expression.LessThan(e1, e2), parameter);
}
/// <summary>
/// 自定义大于等于比较
/// </summary>
/// <param name="e1"></param>
/// <param name="e2"></param>
/// <param name="parameter"></param>
/// <returns></returns>
private static Expression<Func<T, bool>> MyGreaterThanOrEqual(Expression e1, Expression e2, ParameterExpression parameter)
{
if (IsNullableType(e1.Type) && !IsNullableType(e2.Type))
e2 = Expression.Convert(e2, e1.Type);
else if (!IsNullableType(e1.Type) && IsNullableType(e2.Type))
e1 = Expression.Convert(e1, e2.Type);
return Expression.Lambda<Func<T, bool>>(Expression.GreaterThanOrEqual(e1, e2), parameter);
}
/// <summary>
/// 自定义小于等于比较
/// </summary>
/// <param name="e1"></param>
/// <param name="e2"></param>
/// <param name="parameter"></param>
/// <returns></returns>
private static Expression<Func<T, bool>> MyLessThanOrEqual(Expression e1, Expression e2, ParameterExpression parameter)
{
if (IsNullableType(e1.Type) && !IsNullableType(e2.Type))
e2 = Expression.Convert(e2, e1.Type);
else if (!IsNullableType(e1.Type) && IsNullableType(e2.Type))
e1 = Expression.Convert(e1, e2.Type);
return Expression.Lambda<Func<T, bool>>(Expression.LessThanOrEqual(e1, e2), parameter);
}
}
}
@@ -0,0 +1,42 @@
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using SqlSugar;
namespace JSMachine.WMS.Infrastructure.LambdaHelp
{
public static class OrderExpression
{
public static ISugarQueryable<T> OrderByLambda<T>(this ISugarQueryable<T> source, string property, OrderByType orderByType)
{
return ApplyOrder<T>(source, property, orderByType.ToString());
}
static ISugarQueryable<T> ApplyOrder<T>(ISugarQueryable<T> source, string property, string methodName)
{
string[] props = property.Split('.');
Type type = typeof(T);
ParameterExpression arg = Expression.Parameter(type, "x");
Expression expr = arg;
foreach (string prop in props)
{
// use reflection (not ComponentModel) to mirror LINQ
PropertyInfo pi = type.GetProperty(prop);
expr = Expression.Property(expr, pi);
type = pi.PropertyType;
}
Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), type);
LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);
object result = typeof(Queryable).GetMethods().Single(
method => method.Name == methodName
&& method.IsGenericMethodDefinition
&& method.GetGenericArguments().Length == 2
&& method.GetParameters().Length == 2)
.MakeGenericMethod(typeof(T), type)
.Invoke(null, new object[] { source, lambda });
return (ISugarQueryable<T>)result;
}
}
}