using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; namespace 电子展板.Utility.Core { /// /// LINQ扩展方法 /// public static class LinqExtension { /// /// 与连接 /// /// 类型 /// 左条件 /// 右条件 /// 新表达式 public static Expression> And(this Expression> left, Expression> right) { return CombineLambdas(left, right, ExpressionType.AndAlso); } /// /// 或连接 /// /// 类型 /// 左条件 /// 右条件 /// 新表达式 public static Expression> Or(this Expression> left, Expression> right) { return CombineLambdas(left, right, ExpressionType.OrElse); } private static Expression> CombineLambdas(this Expression> left, Expression> 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>(body, left.Parameters[0]); } /// /// 取最大值 /// /// /// /// /// /// public static TResult MaxOrDefault(this IQueryable source, Expression> selector) => source.Select(selector).OrderByDescending(_ => _).FirstOrDefault(); /// /// 取最大值 /// /// /// /// /// /// /// public static TResult MaxOrDefault(this IQueryable source, Expression> selector, TResult defaultValue) { TResult result = source.Select(selector).OrderByDescending(_ => _).FirstOrDefault(); if (result != null) return result; return defaultValue; } /// /// 取最大值 /// /// /// /// public static TSource MaxOrDefault(this IQueryable source) { return source.OrderByDescending(_ => _).FirstOrDefault(); } /// /// 取最大值 /// /// /// /// /// public static TSource MaxOrDefault(this IQueryable source, TSource defaultValue) { TSource result = source.OrderByDescending(_ => _).FirstOrDefault(); if (result != null) return result; return defaultValue; } /// /// 取最大值 /// /// /// /// /// /// /// public static TResult MaxOrDefault(this IEnumerable source, Func selector, TResult defaultValue) { TResult result = source.Select(selector).OrderByDescending(_ => _).FirstOrDefault(); if (result != null) return result; return defaultValue; } /// /// 取最大值 /// /// /// /// public static TSource MaxOrDefault(this IEnumerable source) => source.OrderByDescending(_ => _).FirstOrDefault(); /// /// 取最大值 /// /// /// /// /// public static TSource MaxOrDefault(this IEnumerable source, TSource defaultValue) { TSource result = source.OrderByDescending(_ => _).FirstOrDefault(); if (result != null) return result; return defaultValue; } /// /// 取最小值 /// /// /// /// /// /// public static TResult MinOrDefault(this IQueryable source, Expression> selector) => source.Select(selector).OrderBy(_ => _).FirstOrDefault(); /// /// 取最小值 /// /// /// /// /// /// /// public static TResult MinOrDefault(this IQueryable source, Expression> selector, TResult defaultValue) { TResult result = source.Select(selector).OrderBy(_ => _).FirstOrDefault(); if (result != null) return result; return defaultValue; } /// /// 取最小值 /// /// /// /// public static TSource MinOrDefault(this IQueryable source) => source.OrderBy(_ => _).FirstOrDefault(); /// /// 取最小值 /// /// /// /// /// public static TSource MinOrDefault(this IQueryable source, TSource defaultValue) { TSource result = source.OrderBy(_ => _).FirstOrDefault(); if (result != null) return result; return defaultValue; } /// /// 取最小值 /// /// /// /// /// /// public static TResult MinOrDefault(this IEnumerable source, Func selector) => source.Select(selector).OrderBy(_ => _).FirstOrDefault(); /// /// 取最小值 /// /// /// /// /// /// /// public static TResult MinOrDefault(this IEnumerable source, Func selector, TResult defaultValue) { TResult result = source.Select(selector).OrderBy(_ => _).FirstOrDefault(); if (result != null) return result; return defaultValue; } /// /// 取最小值 /// /// /// /// public static TSource MinOrDefault(this IEnumerable source) => source.OrderBy(_ => _).FirstOrDefault(); /// /// 取最小值 /// /// /// /// /// public static TSource MinOrDefault(this IEnumerable source, TSource defaultValue) { TSource result = source.OrderBy(_ => _).FirstOrDefault(); if (result != null) return result; return defaultValue; } } internal class SubstituteParameterVisitor : ExpressionVisitor { public Dictionary Sub = new Dictionary(); protected override Expression VisitParameter(ParameterExpression node) { return Sub.TryGetValue(node, out var newValue) ? newValue : node; } } }