Не уверен, где твоя проблема.Я предполагаю, что вы хотите
IEnumerable<string> enumerable = new List<string>();
Expression<Func<IEnumerable<string>, IEnumerable<bool>>> expression = a => a.Select(b => b == true);
Для автоматического увеличения и уменьшения.Дело в том, что AsParallel () просто возвращает класс, который реализует другой метод GetEnumerator ().Он по-прежнему работает через интерфейс IEnumerable .Так почему бы вам не реализовать
Expression<Func<ParallelQuery<TSource>, IEnumerable<bool>>> expression = a => a.Select(b => b == true);
по умолчанию?Тогда есть что-то вроде:
void Execute(Expression<Func<ParallelQuery<string>, IEnumerable<bool>>> expression, IEnumerable<string> strings)
{
ParallelQuery<string> parStrings;
if (!typeof (ParallelQuery<string>).IsAssignableFrom(strings.GetType()))
parStrings = strings as ParallelQuery<string>;
else
parStrings = strings.AsParallel();
expression.Compile()(parStrings);
}
Короче говоря.Пусть ваше выражение работает по умолчанию с ParallelQuery и преобразует ваш IEnumerable в ParallelQuery .В противном случае вы смотрите на обход узла / перекомпоновку запроса.(Не уверен, что это ответит на ваш вопрос. Но в любом случае на болтовню.)
Просто предупреждение с предупреждением Expression.Compile () - очень тяжелый метод.Если вам нужна производительность, по возможности избегайте ее.