Creación en tiempo de ejecución de la expresión LINQ

Di que tengo esta expresión:

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

Esto básicamente 'divide' un conjunto de elementos en 20 particiones y recupera de cada conjunto cada primer y cuarto elemento.

Esta expresión se pasa aMongoDB que esconductor es perfectamente capaz de traducir a una "consulta" de MongoDB. Sin embargo, el predicado también se puede utilizar en una lista de objetos (LINQ2Objects), etc. Quiero que esta expresión sea reutilizable (SECO). Sin embargo, quiero poder pasar en unIEnumerable<int> para especificar qué elementos recuperar (por lo que 1 y 4 no están "codificados"):

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

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

Puedo examinar la expresión:

Ahora, quiero poder construir una reproducción exacta de esta expresión pero con una cantidad variable de enteros para pasar (así que en lugar de 1 y 4 podría pasar, por ejemplo,[1, 5, 9, 11] o[8] o[1, 2, 3, 4, 5, 6, ..., 16]).

He intentado usarExpresiones Binarias etc. pero no han podido construir este mensaje correctamente. El principal problema es que la mayoría de misintentos fallará al pasar el predicado a MongoDB.La versión "codificada" funciona bien pero de alguna manera, todos mis intentos de pasar mis expresiones dinámicas no se pueden traducir en una consulta MongoDB por el controlador C #:

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

Básicamente, quiero construir dinámicamente la expresión en tiempo de ejecución de tal manera que replique exactamente lo que el compilador genera para la versión "codificada".

Cualquier ayuda será apreciada.

EDITAR

Según lo solicitado en los comentarios. (ypublicado en pastebin), uno de mis intentos a continuación. Lo estoy publicando en la pregunta para una referencia más detallada si el pastebin lo quita o detiene su servicio o ...

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

Esto resulta en:Unsupported where clause: <InvocationExpression>.

Respuestas a la pregunta(1)

Su respuesta a la pregunta