Domanda

Nella mia classe personalizzata ObjectContext Ho le mie collezioni di entità esposti come IObjectSet in modo che possano essere testati unità. Ho incontrato un problema quando uso questo ObjectContext in una query compilata e chiamo la "include" metodo di estensione (dal blog di Julie Lerman http://thedatafarm.com/blog/data-access/agile-entity-framework-4-repository-part-5-iobjectset/ ) e nel suo libro di programmazione Entity Framework 2 ° edizione alle pagine 722-723. Ecco il codice:

Query:

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

estensione

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 non riconosce il metodo 'System.Linq.IQueryable1 [MyPocoObject] Includere [MyIncludedPocoObject] (System.Linq.IQueryable1 [MyPocoObject], System.String)' metodo, e questo metodo non può essere tradotto in un negozio espressione.

Se io uso questo stessa query su collezioni ObjectSet piuttosto che IObjectSet funziona benissimo. Se ho semplicemente funzionare questa domanda senza precompilazione funziona benissimo. Che cosa mi manca qui?

È stato utile?

Soluzione 2

Risposta da EF della squadra:

Questo è un problema noto con CTP4, Include è un metodo di istanza su ObjectSet ma quando il set è tipizzata come IObjectSet si sta in realtà utilizzando un metodo di estensione su IQueryable che è incluso in CTP4. Questo metodo di estensione non funziona con le query compilate, ma cercheremo di sostenere questo nella prossima release.

Altri suggerimenti

Io davvero non lo so, ma hanno chiesto se qualcuno del team EF può rispondere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top