在框架搭建-三层架构关于DAL层数据操作中,BaseDAL提供了一些基础的增删改查操作,其操作的实现是根据直接提供的Lambda表达式。
直接提供Lambda表达式虽然方便但是对开发人员有技术要求(并非每个人都熟练掌握Lambda表达式)、Lambda表达式的书写易于出错且个人书写风格不同等,都表明动态拼接生成Lambda表达式是一种更好的选择。
以下是借鉴诸多网友并自己封装的一个Lambda表达式动态拼接生成工具类
/// <summary>
/// 生成Lambda表达式工具类
/// 创建人:o527883184
/// 日期:2018-04-08 21:34
/// </summary>
public static class LambdaUtil<T>
{
/// <summary>
/// lambda表达式:t=>true
/// </summary>
/// <returns></returns>
public static Expression<Func<T, bool>> True()
{
return t => true;
}
/// <summary>
/// lambda表达式:t=>false
/// </summary>
/// <returns></returns>
public static Expression<Func<T, bool>> False()
{
return t => false;
}
/// <summary>
/// lambda表达式:t=>t.propName
/// 多用于order排序
/// </summary>
/// <typeparam name="T">参数类型</typeparam>
/// <typeparam name="TKey">返回类型</typeparam>
/// <param name="propName">属性名</param>
/// <returns></returns>
private static Expression<Func<T, TKey>> Order<TKey>(string propName)
{
// 创建节点参数t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
// 创建一个属性
MemberExpression property = Expression.Property(parameter, propName);
// 生成lambda表达式
return Expression.Lambda<Func<T, TKey>>(property, parameter);
}
/// <summary>
/// lambda表达式:t=>t.propName==propValue
/// 多用于where条件
/// </summary>
/// <typeparam name="T">参数类型</typeparam>
/// <param name="propName">属性名称</param>
/// <param name="propValue">属性值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> Equal(string propName, object propValue)
{
// 创建节点参数t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
// 创建一个成员(字段/属性)
MemberExpression member = Expression.PropertyOrField(parameter, propName);
// 创建一个常数
ConstantExpression constant = Expression.Constant(propValue);
// 创建一个相等比较Expression
BinaryExpression binary = Expression.Equal(member, constant);
// 生成lambda表达式
return Expression.Lambda<Func<T, bool>>(binary, parameter);
}
/// <summary>
/// lambda表达式:t=>t.propName!=propValue
/// 多用于where条件
/// </summary>
/// <typeparam name="T">参数类型</typeparam>
/// <param name="propName">属性名称</param>
/// <param name="propValue">属性值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> NotEqual(string propName, object propValue)
{
// 创建节点参数t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
// 创建一个成员(字段/属性)
MemberExpression member = Expression.PropertyOrField(parameter, propName);
// 创建一个常数
ConstantExpression constant = Expression.Constant(propValue);
// 创建一个不相等比较Expression
BinaryExpression binary = Expression.NotEqual(member, constant);
// 生成lambda表达式
return Expression.Lambda<Func<T, bool>>(binary, parameter);
}
/// <summary>
/// lambda表达式:t=>t.propName<propValue
/// 多用于where条件
/// </summary>
/// <typeparam name="T">参数类型</typeparam>
/// <param name="propName">属性名称</param>
/// <param name=