首页 > 代码库 > Expression树的追加和拼接
Expression树的追加和拼接
封装的类
public class WhereHelper<T> where T : class
{
private ParameterExpression param;
private BinaryExpression filter;
public WhereHelper()
{
param = Expression.Parameter(typeof(T), "c");
//1==1
Expression left = Expression.Constant(1);
filter = Expression.Equal(left, left);
}
/// <summary>
/// 格式化成Expression<Func<T, bool>>
/// </summary>
/// <returns></returns>
public Expression<Func<T, bool>> GetExpression()
{
return Expression.Lambda<Func<T, bool>>(filter, param);
}
/// <summary>
/// 等于
/// </summary>
/// <param name="propertyName">属性</param>
/// <param name="value">值</param>
/// <param name="type">and 还是 or</param>
public void Equal(string propertyName, object value,string type)
{
Expression left = Expression.Property(param, typeof(T).GetProperty(propertyName));
Expression right = Expression.Constant(value, value.GetType());
Expression result = Expression.Equal(left, right);
if (type.ToLower() == "and")
filter = Expression.And(filter, result);
else
filter = Expression.Or(filter, result);
}
/// <summary>
/// 包含(模糊查询)
/// </summary>
/// <param name="propertyName">属性</param>
/// <param name="value">值</param>
/// <param name="type">and 还是 or</param>
public void Contains(string propertyName, string value,string type)
{
Expression left = Expression.Property(param, typeof(T).GetProperty(propertyName));
Expression right = Expression.Constant(value, value.GetType());
Expression result = Expression.Call(left, typeof(string).GetMethod("Contains"), right);
if (type.ToLower() == "and")
filter = Expression.And(filter, result);
else
filter = Expression.Or(filter, result);
}
/// <summary>
/// 小于
/// </summary>
/// <param name="propertyName"></param>
/// <param name="value"></param>
public void LessThan(string propertyName, object value, string type)
{
Expression left = Expression.Property(param, typeof(T).GetProperty(propertyName));
Expression right = Expression.Constant(value, value.GetType());
Expression result = Expression.LessThan(left, right);
if (type.ToLower() == "and")
filter = Expression.And(filter, result);
else
filter = Expression.Or(filter, result);
}
/// <summary>
/// 小于等于
/// </summary>
/// <param name="propertyName"></param>
/// <param name="value"></param>
public void LessThanOrEqual(string propertyName, object value, string type)
{
Expression left = Expression.Property(param, typeof(T).GetProperty(propertyName));
Expression right = Expression.Constant(value, value.GetType());
Expression result = Expression.LessThanOrEqual(left, right);
if (type.ToLower() == "and")
filter = Expression.And(filter, result);
else
filter = Expression.Or(filter, result);
}
/// <summary>
/// 大于
/// </summary>
/// <param name="propertyName"></param>
/// <param name="value"></param>
public void GreaterThan(string propertyName, object value, string type)
{
Expression left = Expression.Property(param, typeof(T).GetProperty(propertyName));
Expression right = Expression.Constant(value, value.GetType());
Expression result = Expression.GreaterThan(left, right);
if (type.ToLower() == "and")
filter = Expression.And(filter, result);
else
filter = Expression.Or(filter, result);
}
/// <summary>
///大于等于
/// </summary>
/// <param name="propertyName"></param>
/// <param name="value"></param>
public void GreaterThanOrEqual(string propertyName, object value, string type)
{
Expression left = Expression.Property(param, typeof(T).GetProperty(propertyName));
Expression right = Expression.Constant(value, value.GetType());
Expression result = Expression.GreaterThanOrEqual(left, right);
if (type.ToLower() == "and")
filter = Expression.And(filter, result);
else
filter = Expression.Or(filter, result);
}
}
调用的方法类似:
WhereHelper<UserInfo> user = new WhereHelper<UserInfo>();
user.Equal("State", EumState.Enable,"and");
if (!string.IsNullOrEmpty(result))
{
user.Contains("Name", result,"and");
user.Contains("LoginName", result,"or");
}
if (!string.IsNullOrEmpty(roleGuid))
{
user.Equal("RoleGuid", new Guid(roleGuid),"and");
}
var list = _userInfoService.GetUserInfo(user.GetExpression(), pageIndex, pageSize);
Expression树的追加和拼接