Pregunta

En mi clase ObjectContext personalizada tengo mis colecciones de entidades expuestas como IObjectSet para que puedan ser probados unidad. Me he encontrado con un problema cuando se utiliza esta ObjectContext en una consulta compilada y llamo el "Incluir" método de extensión (Desde el blog de Julie Lerman http://thedatafarm.com/blog/data-access/agile-entity-framework-4-repository-part-5-iobjectset/ ) y en su libro de programación Entity Framework segunda edición en las páginas 722-723. Aquí está el código:

Consulta:

public class CommunityPostsBySlugQuery : QueryBase<IEnumerable<CommunityPost>>
    {
        private static readonly Expression<Func<Database, string, IEnumerable<CommunityPost>>> expression = (database, slug) => database.CommunityPosts.Include("Comments").Where(x => x.Site.Slug == slug).OrderByDescending(x => x.DatePosted);
        private static readonly Func<Database, string, IEnumerable<CommunityPost>> plainQuery = expression.Compile();

        private static readonly Func<Database, string, IEnumerable<CommunityPost>> compiledQuery = CompiledQuery.Compile(expression);

        private readonly string _slug;
        public CommunityPostsBySlugQuery(bool useCompiled, string slug): base(useCompiled)
        {
            _slug = slug;
        }

        public override IEnumerable<CommunityPost> Execute(Database database)
        {
            return base.UseCompiled ? compiledQuery(database, _slug) : plainQuery(database, _slug);
        }
    }

Extensión

public static class ObjectQueryExtension
    {
        public static IQueryable<T> Include<T>(this IQueryable<T> source, string path)
        {
            var objectQuery = source as ObjectQuery<T>;
            return objectQuery == null ? source : objectQuery.Include(path);
        }
    }

LINQ to Entities no reconoce el método 'System.Linq.IQueryable1 [MyPocoObject] Incluir [MyIncludedPocoObject] (System.Linq.IQueryable1 [MyPocoObject], System.String)' método, y este método no se puede traducir en una tienda expresión.

Si utilizo esta misma consulta en colecciones ObjectSet en lugar de IObjectSet funciona bien. Si sólo tiene que ejecutar esta consulta sin precompilar funciona bien. Lo que me estoy perdiendo aquí?

¿Fue útil?

Solución 2

Respuesta por EF Equipo:

Este es un problema conocido con CTP4, se Incluir un método de instancia en ObjectSet pero cuando el conjunto se escribe como IObjectSet en realidad está utilizando un método de extensión en IQueryable que se incluye en CTP4. Este método de extensión no funciona con consultas compiladas pero vamos a tratar y apoyar esto en la próxima versión.

Otros consejos

Realmente no sé, pero han preguntado si alguien del equipo de EF puede responder a ella.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top