【问题标题】:IObjectSet Include Extension Method Errors with CompiledQueryIObjectSet 包含 CompiledQuery 的扩展方法错误
【发布时间】:2010-11-16 18:10:19
【问题描述】:

在我的自定义 ObjectContext 类中,我将实体集合公开为 IObjectSet,以便对它们进行单元测试。当我在编译查询中使用此 ObjectContext 并调用“包含”扩展方法(来自 Julie Lerman 的博客http://thedatafarm.com/blog/data-access/agile-entity-framework-4-repository-part-5-iobjectset/)和她的书 Programming Entity Framework 2nd edition on page 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] Include[MyIncludedPocoObject](System.Linq.IQueryable1[MyPocoObject], System.String)' 方法,并且此方法无法转换为存储表达。

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

【问题讨论】:

  • 我认为你的页码有误,可能是 272-273?

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


【解决方案1】:

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

【讨论】:

  • 感谢您花时间询问。一个月以来一直在为此苦苦挣扎。很高兴得到答案!
【解决方案2】:

EF 团队的回应:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多