using System.Linq.Expressions; namespace Jiaowu.Api.Infrastructure.Persistence; public static class QueryableCollectionExtensions { public static IQueryable WhereIn( this IQueryable source, IEnumerable values, Expression> valueSelector) { var predicate = BuildPredicate(values, valueSelector, Expression.OrElse, false); return source.Where(predicate); } public static IQueryable WhereNotIn( this IQueryable source, IEnumerable values, Expression> valueSelector) { var predicate = BuildPredicate(values, valueSelector, Expression.AndAlso, true); return source.Where(predicate); } private static Expression> BuildPredicate( IEnumerable values, Expression> valueSelector, Func combine, bool negate) { Expression? body = null; foreach (var value in values.Distinct()) { Expression comparison = Expression.Equal( valueSelector.Body, Expression.Constant(value, typeof(TValue))); if (negate) comparison = Expression.Not(comparison); body = body is null ? comparison : combine(body, comparison); } body ??= Expression.Constant(negate); return Expression.Lambda>( body, valueSelector.Parameters); } }