C# IObjectSet包含CompiledQuery的扩展方法错误

C# IObjectSet包含CompiledQuery的扩展方法错误,c#,entity-framework-4,ef-code-first,C#,Entity Framework 4,Ef Code First,在自定义ObjectContext类中,我将实体集合公开为IOObjectSet,以便可以对它们进行单元测试。当我在编译查询中使用这个ObjectContext并调用“Include”扩展方法(来自Julie Lerman的博客)和她的书《编程实体框架第二版》(第722-723页)时,我遇到了一个问题。 代码如下: 查询: public class CommunityPostsBySlugQuery : QueryBase<IEnumerable<CommunityPost>&

在自定义ObjectContext类中,我将实体集合公开为IOObjectSet,以便可以对它们进行单元测试。当我在编译查询中使用这个ObjectContext并调用“Include”扩展方法(来自Julie Lerman的博客)和她的书《编程实体框架第二版》(第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类CommunityPostsBySlugQuery:QueryBase
{
私有静态只读表达式表达式=(数据库,slug)=>database.CommunityPosts.Include(“Comments”)。其中(x=>x.Site.slug==slug)。OrderByDescending(x=>x.DatePosted);
private static readonly Func plainQuery=expression.Compile();
私有静态只读Func compiledQuery=compiledQuery.Compile(表达式);
私有只读字符串_slug;
公共通信类型stsbyslugquery(bool-useCompiled,string-slug):base(useCompiled)
{
_段塞=段塞;
}
公共重写IEnumerable Execute(数据库)
{
return base.UseCompiled?compiledQuery(数据库,\u slug):plainQuery(数据库,\u 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);
        }
    }
公共静态类ObjectQueryExtension
{
公共静态IQueryable包含(此IQueryable源,字符串路径)
{
var objectQuery=源作为objectQuery;
return objectQuery==null?来源:objectQuery.Include(路径);
}
}
LINQ to实体无法识别方法“System.LINQ.IQueryable1[MyPocoObject]Include[MyIncludedPocoObject](System.LINQ.IQueryable1[MyPocoObject],System.String)”方法,并且无法将此方法转换为存储表达式


如果我对ObjectSet集合而不是IOObjectSet使用相同的查询,它就可以正常工作。如果我只是运行这个查询而不进行预编译,它就可以正常工作。我在这里遗漏了什么?

我真的不知道,但我问过EF团队中是否有人可以回答。

EF团队的回答:


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

我认为您的页码错误,可能是272-273?感谢您抽出时间询问。我已经为此挣扎了一个月了。如果能得到答案那就太好了!