private Expression <Func <string, bool> > ResolveInFunc(MethodCallExpression methodCallExpression, bool @in) { if (methodCallExpression.IsEnumerableContains(methodCallExpression.Method.Name) && IsMethodWrapShardingKey(methodCallExpression)) { object arrayObject = null; if (methodCallExpression.Object != null) { if (methodCallExpression.Object is MemberExpression member1Expression) { arrayObject = Expression.Lambda(member1Expression).Compile().DynamicInvoke(); } else if (methodCallExpression.Object is ListInitExpression member2Expression) { arrayObject = Expression.Lambda(member2Expression).Compile().DynamicInvoke(); } } else if (methodCallExpression.Arguments[0] is MemberExpression member2Expression) { arrayObject = Expression.Lambda(member2Expression).Compile().DynamicInvoke(); } else if (methodCallExpression.Arguments[0] is NewArrayExpression member3Expression) { arrayObject = Expression.Lambda(member3Expression).Compile().DynamicInvoke(); } if (arrayObject != null) { var enumerable = (IEnumerable)arrayObject; Expression <Func <string, bool> > contains = x => false; if (!@in) { contains = x => true; } foreach (var item in enumerable) { var keyValue = _shardingKeyConvert(item); var eq = _keyToTailWithFilter(keyValue, @in ? ShardingOperatorEnum.Equal : ShardingOperatorEnum.NotEqual); if (@in) { contains = contains.Or(eq); } else { contains = contains.And(eq); } } return(contains); } } return(x => true); }