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