IQueryable <T> con EntityObject usando Genéricos e Interfaces (¿Posible?)

Tengo un repositorio de búsqueda para EntityFramework 4.0 usando LinqKit con la siguiente función de búsqueda:

public IQueryable<T> Search<T>(Expression<Func<T, bool>> predicate) 
    where T : EntityObject
{
    return _unitOfWork.ObjectSet<T>().AsExpandable().Where(predicate);
}

Y otra clase que usa el valor de retorno IQueryable para subconjugar la consulta de formas que no son posibles usando las expresiones Boolean LinqKit PredicateBuilder:

public IQueryable<T> SubsetByUser<T>(IQueryable<T> set, User user) 
    where T : EntityObject
{
    return set.Join(_searcher.Search<Metadatum>((o) => o.UserGUID == user.GUID),
                    arc => arc.GUID,
                    meta => meta.ElementGUID,
                    (arc, meta) => arc);
}

El problema aquí es que 'T' como EntityObject no define GUID, por lo que no puedo usar esto. La respuesta natural a esto es definir realmente el método SubsetByUser () para usar una restricción con una propiedad GUID:

public IQueryable<T> SubsetByUser<T>(IQueryable<T> set, User user) 
    where T : IHaveMetadata
{
    return set.Join(_searcher.Search<Metadatum>((o) => o.UserGUID == user.GUID),
                    arc => arc.GUID,
                    meta => meta.ElementGUID,
                    (arc, meta) => arc);
}

Pero esto no funciona. Estoy usando LinqKit y el método Expandable () da como resultado:

System.NotSupportedException: Unable to cast the type 'Oasis.DataModel.Arc' to
type 'Oasis.DataModel.Interfaces.IHaveMetadata'. LINQ to Entities only supports 
casting Entity Data Model primitive types

Necesito un IQueryable para ser devuelto. Puedo hacer una falsa como esta:

public IQueryable<T> SubsetByUser<T>(IQueryable<T> set, User user) 
    where T : EntityObject
{
    return set.AsEnumerable()
              .Join(_searcher.Search<Metadatum>((o) => o.UserGUID == user.GUID),
                    arc => arc.GUID,
                    meta => meta.ElementGUID,
                    (arc, meta) => arc)
              .AsQueryable();
}

Que, por supuesto, funciona, pero que también es, por supuesto, una locura de murciélago. (Toda la razón por la que quiero IQueryable es para no ejecutar la consulta hasta que estemos finalizados.

Incluso he intentado esto:

public IQueryable<T> SubsetByUser<T>(IQueryable<T> set, User user) 
    where T : EntityObject
{
    return set.Join(_searcher.Search<Metadatum>((o) => o.UserGUID == user.GUID),
                    arc => arc.GetType().GetProperty("GUID").GetValue(arc,null),
                    meta => meta.ElementGUID,
                    (arc, meta) => arc);
}

Which utiliza la reflexión para obtener la colección Runs, evitando el error del compilador. Pensé que era bastante inteligente, pero resulta en la excepción LINQ:

System.NotSupportedException: LINQ to Entities does not recognize the 
method 'System.Object GetValue(System.Object, System.Object[])' method, 
and this method cannot be translated into a store expression.

También podría intentar cambiar el método de búsqueda:

public IQueryable<T> Search<T>(Expression<Func<T, bool>> predicate) 
    where T : IRunElement
{
    return _unitOfWork.ObjectSet<T>().AsExpandable().Where(predicate);
}

Pero, por supuesto, esto no se compilará porque IRunElement no es un EntityObject y ObjectSet restringe T como una clase.

La posibilidad final es simplemente hacer que todos los parámetros y valores devueltos sean IEnumerable:

public IEnumerable<T> SubsetByUser<T>(IEnumerable<T> set, User user) 
    where T : EntityObject
{
    return set.Join(_searcher.Search<Metadatum>((o) => o.UserGUID == user.GUID),
                    arc => arc.GetType().GetProperty("GUID").GetValue(arc,null),
                    meta => meta.ElementGUID,
                    (arc, meta) => arc);
}

Lo que también funciona, pero que, de nuevo, no nos permite retrasar la creación de instancias hasta el final.

Entonces, parece que hay poco que puedo hacer para que esto funcione sin crear una instancia de todo como IEnumerable y luego devolverlo usando AsQueryable (). ¿Hay alguna manera de que pueda armar esto que me falta?

Respuestas a la pregunta(2)

Su respuesta a la pregunta