IObjectSet包含CompiledQuery的扩展方法错误

时间:2010-11-16 18:10:20

标签: c# entity-framework-4 ef-code-first

在我的Custom ObjectContext类中,我将实体集合公开为IObjectSet,因此可以对它们进行单元测试。当我在编译查询中使用此ObjectContext并调用“Include”扩展方法(来自Julie Lerman的博客http://thedatafarm.com/blog/data-access/agile-entity-framework-4-repository-part-5-iobjectset/)和她的书“编程实体框架第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);
        }
    }

扩展

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]包含[MyIncludedPocoObject](System.Linq.IQueryable1 [MyPocoObject],System.String)'方法,并且此方法无法转换为商店表达

如果我在ObjectSet集合而不是IObjectSet上使用相同的查询,它可以正常工作。如果我只是运行此查询而不预编译它工作正常。我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

我真的不知道,但已经问过EF团队中的某个人是否可以回答它。

答案 1 :(得分:1)

EF团队回复:

这是CTP4的一个已知问题,Include是ObjectSet上的一个实例方法,但当您的设置输入为IObjectSet时,您实际上在IQueryable上使用了包含的扩展方法在CTP4中。此扩展方法不适用于已编译的查询,但我们将在下一版本中尝试并支持此功能。