规约

    public static class Spec
    {
        /// <summary>
        /// True条件。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns>True条件</returns>
        public static Expression<Func<T, bool>> True<T>() { return f => true; }

        /// <summary>
        /// False条件。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns>False条件</returns>
        public static Expression<Func<T, bool>> False<T>() { return f => false; }

        /// <summary>
        /// 逻辑或。
        /// </summary>
        /// <param name="left">左逻辑。</param>
        /// <param name="right">右逻辑。</param>
        /// <returns>逻辑表达式。</returns>
        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
        {
            var invokedExpr = Expression.Invoke(right, left.Parameters);
            return Expression.Lambda<Func<T, bool>>(Expression.Or(left.Body, invokedExpr), left.Parameters);
        }

        /// <summary>
        /// 逻辑与。
        /// </summary>
        /// <param name="left">左逻辑。</param>
        /// <param name="right">右逻辑。</param>
        /// <returns>逻辑表达式。</returns>
        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
        {
            var invokedExpr = Expression.Invoke(right, left.Parameters);
            return Expression.Lambda<Func<T, bool>>(Expression.And(left.Body, invokedExpr), left.Parameters);
        }
    }
原文地址:https://www.cnblogs.com/krockey/p/14592387.html