IObjectSet включает ошибки метода расширения с помощью CompiledQuery - PullRequest
3 голосов
/ 16 ноября 2010

В моем классе Custom ObjectContext мои коллекции сущностей выставлены как IObjectSet, поэтому они могут быть проверены модулем. Я столкнулся с проблемой, когда использую этот ObjectContext в скомпилированном запросе и вызываю метод расширения «Включить» (из блога Джулии Лерман http://thedatafarm.com/blog/data-access/agile-entity-framework-4-repository-part-5-iobjectset/) и в ее книге «Программирование Entity Framework 2-е издание» на страницах 722-723. Вот код:

Запрос:

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

Extension

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 не распознает метод 'System.Linq.IQueryable1 [MyPocoObject] Include [MyIncludedPocoObject] (System.Linq.IQueryable1 [MyPocoObject], System.String)', и этот метод нельзя преобразовать в хранилище выражение.

Если я использую этот же запрос в коллекциях ObjectSet, а не в IObjectSet, он работает нормально. Если я просто запускаю этот запрос без предварительной компиляции, он работает нормально. Что мне здесь не хватает?

Ответы [ 2 ]

1 голос
/ 01 декабря 2010

Ответ команды EF:

Это известная проблема с CTP4, Include является методом экземпляра на ObjectSet, но когда ваш набор набран как IObjectSet, вы фактически используете метод расширения на IQueryable, который включен в CTP4.Этот метод расширения не работает с скомпилированными запросами, но мы постараемся поддержать его в следующем выпуске.

1 голос
/ 16 ноября 2010

Я действительно не знаю, но спросил, может ли кто-нибудь из команды EF ответить на него.

...