| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.Linq;
 
- using System.Linq.Expressions;
 
- namespace Masuit.Tools.Linq
 
- {
 
-     /// <summary>
 
-     /// LINQ扩展方法
 
-     /// </summary>
 
-     public static class LinqExtension
 
-     {
 
-         /// <summary>
 
-         /// 与连接
 
-         /// </summary>
 
-         /// <typeparam name="T">类型</typeparam>
 
-         /// <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)
 
-         {
 
-             return CombineLambdas(left, right, ExpressionType.AndAlso);
 
-         }
 
-         /// <summary>
 
-         /// 或连接
 
-         /// </summary>
 
-         /// <typeparam name="T">类型</typeparam>
 
-         /// <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)
 
-         {
 
-             return CombineLambdas(left, right, ExpressionType.OrElse);
 
-         }
 
-         private static Expression<Func<T, bool>> CombineLambdas<T>(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right, ExpressionType expressionType)
 
-         {
 
-             var visitor = new SubstituteParameterVisitor
 
-             {
 
-                 Sub =
 
-                 {
 
-                     [right.Parameters[0]] = left.Parameters[0]
 
-                 }
 
-             };
 
-             Expression body = Expression.MakeBinary(expressionType, left.Body, visitor.Visit(right.Body));
 
-             return Expression.Lambda<Func<T, bool>>(body, left.Parameters[0]);
 
-         }
 
-         private static bool IsExpressionBodyConstant<T>(Expression<Func<T, bool>> left)
 
-         {
 
-             return left.Body.NodeType == ExpressionType.Constant;
 
-         }
 
-         /// <summary>
 
-         /// 取最大值
 
-         /// </summary>
 
-         /// <typeparam name="TSource"></typeparam>
 
-         /// <typeparam name="TResult"></typeparam>
 
-         /// <param name="source"></param>
 
-         /// <param name="selector"></param>
 
-         /// <returns></returns>
 
-         public static TResult MaxOrDefault<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector) => source.Select(selector).OrderByDescending(_ => _).FirstOrDefault();
 
-         /// <summary>
 
-         /// 取最大值
 
-         /// </summary>
 
-         /// <typeparam name="TSource"></typeparam>
 
-         /// <param name="source"></param>
 
-         /// <returns></returns>
 
-         public static TSource MaxOrDefault<TSource>(this IQueryable<TSource> source) => source.OrderByDescending(_ => _).FirstOrDefault();
 
-         /// <summary>
 
-         /// 取最大值
 
-         /// </summary>
 
-         /// <typeparam name="TSource"></typeparam>
 
-         /// <typeparam name="TResult"></typeparam>
 
-         /// <param name="source"></param>
 
-         /// <param name="selector"></param>
 
-         /// <returns></returns>
 
-         public static TResult MaxOrDefault<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) => source.Select(selector).OrderByDescending(_ => _).FirstOrDefault();
 
-         /// <summary>
 
-         /// 取最大值
 
-         /// </summary>
 
-         /// <typeparam name="TSource"></typeparam>
 
-         /// <param name="source"></param>
 
-         /// <returns></returns>
 
-         public static TSource MaxOrDefault<TSource>(this IEnumerable<TSource> source) => source.OrderByDescending(_ => _).FirstOrDefault();
 
-         /// <summary>
 
-         /// 取最小值
 
-         /// </summary>
 
-         /// <typeparam name="TSource"></typeparam>
 
-         /// <typeparam name="TResult"></typeparam>
 
-         /// <param name="source"></param>
 
-         /// <param name="selector"></param>
 
-         /// <returns></returns>
 
-         public static TResult MinOrDefault<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector) => source.Select(selector).OrderBy(_ => _).FirstOrDefault();
 
-         /// <summary>
 
-         /// 取最小值
 
-         /// </summary>
 
-         /// <typeparam name="TSource"></typeparam>
 
-         /// <param name="source"></param>
 
-         /// <returns></returns>
 
-         public static TSource MinOrDefault<TSource>(this IQueryable<TSource> source) => source.OrderBy(_ => _).FirstOrDefault();
 
-         /// <summary>
 
-         /// 取最小值
 
-         /// </summary>
 
-         /// <typeparam name="TSource"></typeparam>
 
-         /// <typeparam name="TResult"></typeparam>
 
-         /// <param name="source"></param>
 
-         /// <param name="selector"></param>
 
-         /// <returns></returns>
 
-         public static TResult MinOrDefault<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) => source.Select(selector).OrderBy(_ => _).FirstOrDefault();
 
-         /// <summary>
 
-         /// 取最小值
 
-         /// </summary>
 
-         /// <typeparam name="TSource"></typeparam>
 
-         /// <param name="source"></param>
 
-         /// <returns></returns>
 
-         public static TSource MinOrDefault<TSource>(this IEnumerable<TSource> source) => source.OrderBy(_ => _).FirstOrDefault();
 
-     }
 
-     internal class SubstituteParameterVisitor : ExpressionVisitor
 
-     {
 
-         public Dictionary<Expression, Expression> Sub = new Dictionary<Expression, Expression>();
 
-         protected override Expression VisitParameter(ParameterExpression node)
 
-         {
 
-             return Sub.TryGetValue(node, out var newValue) ? newValue : node;
 
-         }
 
-     }
 
- }
 
 
  |