Criação em tempo de execução da expressão LINQ

Digamos que eu tenha esta expressão:

int setsize = 20;
Expression<Func<Foo, bool>> predicate = x => x.Seed % setsize == 1
                                          || x.Seed % setsize == 4;

Isso basicamente "particiona" um conjunto de elementos em 20 partições e recupera de cada conjunto cada primeiro e quarto elemento.

Esta expressão é passada paraMongoDB qual émotorista é perfeitamente capaz de traduzir em uma "consulta" do MongoDB. O predicado pode, no entanto, também ser usado em uma lista de objetos (LINQ2Objects) etc. Quero que essa expressão seja reutilizável (SECO). No entanto, eu quero ser capaz de passar em umIEnumerable<int> para especificar quais itens recuperar (para que 1 e 4 não sejam "codificados"):

public Expression<Func<Foo, bool>> GetPredicate(IEnumerable<int> items) {
    //Build expression here and return it
}

ComLINQPad usando este código:

int setsize = 20;
Expression<Func<Foo, bool>> predicate = x => x.Seed % setsize == 1 || x.Seed % setsize == 4;
predicate.Dump();

} 

class Foo
{
    public int Seed { get; set; }

Eu posso examinar a expressão:

Agora, eu quero ser capaz de construir uma reprodução exata dessa expressão, mas com uma quantidade variável de inteiros para passar (assim, em vez de 1 e 4, eu poderia passar, por exemplo,[1, 5, 9, 11] ou[8] ou[1, 2, 3, 4, 5, 6, ..., 16]).

Eu tentei usarBinaryExpressions etc, mas não foram capazes de construir esta mensagem corretamente. A questão principal é que a maioria dos meustentativas falhará ao passar o predicado para o MongoDB.A versão "codificada" funciona bem mas de alguma forma todas as minhas tentativas de passar minhas expressões dinâmicas não são traduzidas em uma consulta do MongoDB pelo driver C #:

{
    "$or" : [{
        "Seed" : { "$mod" : [20, 1] }
    }, {
        "Seed" : { "$mod" : [20, 4] }
    }]
}

Basicamente, eu quero construir dinamicamente a expressão em tempo de execução de tal forma que ela replique exatamente o que o compilador gera para a versão 'hardcoded'.

Qualquer ajuda será apreciada.

EDITAR

Conforme solicitado nos comentários (epostado em pastebin), uma das minhas tentativas abaixo. Estou postando na questão para referência furure deve pastebin abatê-lo ou parar o seu serviço ou ...

using MongoRepository;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

class Program
{
    static void Main(string[] args)
    {
        MongoRepository<Foo> repo = new MongoRepository<Foo>();
        var reporesult = repo.All().Where(IsInSet(new[] { 1, 4 }, 20)).ToArray();
    }

    private static Expression<Func<Foo, bool>> IsInSet(IEnumerable<int> seeds, int setsize)
    {
        if (seeds == null)
            throw new ArgumentNullException("s");

        if (!seeds.Any())
            throw new ArgumentException("No sets specified");

        return seeds.Select<int, Expression<Func<Foo, bool>>>(seed => x => x.Seed % setsize == seed).JoinByOr();
    }
}

public class Foo : Entity
{
    public int Seed { get; set; }
}

public static class Extensions
{
    public static Expression<Func<T, bool>> JoinByOr<T>(this IEnumerable<Expression<Func<T, bool>>> filters)
    {
        var firstFilter = filters.First();
        var body = firstFilter.Body;
        var param = firstFilter.Parameters.ToArray();
        foreach (var nextFilter in filters.Skip(1))
        {
            var nextBody = Expression.Invoke(nextFilter, param);
            body = Expression.Or(body, nextBody);
        }
        return Expression.Lambda<Func<T, bool>>(body, param);
    }
}

Isto resulta em:Unsupported where clause: <InvocationExpression>.

questionAnswers(1)

yourAnswerToTheQuestion