| 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;
- }
- }
- }
|