代码之家  ›  专栏  ›  技术社区  ›  Paul

IObjectSet包含CompiledQuery的扩展方法错误

  •  3
  • Paul  · 技术社区  · 15 年前

    在我的自定义ObjectContext类中,我将实体集合公开为IObjectSet,以便对它们进行单元测试。当我在编译的查询中使用这个ObjectContext并调用“Include”扩展方法(来自Julie Lerman的博客)时遇到了一个问题 http://thedatafarm.com/blog/data-access/agile-entity-framework-4-repository-part-5-iobjectset/ )在她的书《编程实体框架》第二版第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实体无法识别方法“System.LINQ.IQueryable1[MyPocoObject]Include[myincludedpooobject](System.LINQ.IQueryable1[MyPocoObject],System.String)”方法,并且此方法无法转换为存储表达式。

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   Julie Lerman    15 年前

    我真的不知道,但是我问过英孚团队的人是否能回答。

        2
  •  1
  •   slang dbr    11 年前

    EF团队回应:

    这是CTP4的已知问题,Include是 ObjectSet 但是当你的集合被打成 IObjectSet 实际上,您在 IQueryable 包含在CTP4中。此扩展方法不适用于已编译的查询,但我们将在下一版本中尝试并支持此方法。