【问题标题】:Entity Framework non generic Include on dynamic ObjectSet实体框架非泛型包含在动态 ObjectSet 上
【发布时间】:2013-07-17 14:16:55
【问题描述】:

我在为我的应用程序创建数据访问层时遇到了问题。我正在使用实体框架中的派生实体。如果我尝试为派生实体创建 ObjectSet,则会收到此异常:

Blockquote 没有为指定的实体类型“类型名称”定义实体集。如果“类型名称”是派生类型,请改用基类型。

我已尝试通过反射解决此问题。 (如果实体类型是由实体类型派生的 => 获取基本类型的 ObjectSet)

我找到了这个:How can I obtain ObjectSet<T> from Entity-Framework at runtime where T is dynamic?,但我还没有找到如何在构建的 ObjectSet 上使用 Include 和 Where。

protected IEnumerable<IDataObject> GetData(Type entityType, Expression<Func<dynamic, bool>> whereClause, Expression<Func<dynamic, dynamic>>[] includes)
    {
        if (typeof(IDataObject).IsAssignableFrom(entityType.BaseType))
        {
            return GetData(entityType.BaseType, whereClause, includes);
        }
        var contextType = this.Context.GetType();
        MethodInfo createObjectSetMethod = contextType.GetMethod("CreateObjectSet", new Type[] {}).MakeGenericMethod(entityType);
        // Builds up an ObjectSet<EntityType> 
        dynamic objectSet = createObjectSetMethod.Invoke(this.Context, new object[] { });
        dynamic query = objectSet;
        if (includes != null)
        {
            foreach (var include in includes)
            {
                query = query.Include(include);
            }
        }
        if (whereClause == null)
        {
            whereClause = (item) => true;
        }
        query = query.Where(whereClause);
        return query.ToList().OfType<IDataObject>();
    }

只要我不使用 Includes 和 WhereClause,代码就会按预期运行。 当我调用这个函数时,我不知道编译时解析的 ObjectSet(T 参数)。
有没有办法在泛型 ObjectSet 中使用动态表达式?

提前致谢。

【问题讨论】:

    标签: entity-framework c#-4.0 generics


    【解决方案1】:

    问题似乎出在

    query = query.Include(include);

    var include 将是 Expression&lt;Func&lt;dynamic,dynamic&gt;&gt;

    您访问的包含方法需要 stringExpression&lt;Func&lt;T, TProperty&gt;&gt;

    您是否尝试将包含作为字符串路径传递?我希望这能奏效。

    否则需要 construct the expression tree with code 因为你不能将动态对象传递给

     public static IQueryable<T> Include<T, TProperty>(this IQueryable<T> source, Expression<Func<T, TProperty>> path) where T : class;
    

    还有动态 linq 库可以检出。 System.Linq.Dynamic 可以在以下链接中找到 http://msdn.microsoft.com/en-US/vstudio/bb894665.aspx 这里有一个介绍http://www.scottgu.com/blogposts/dynquery/dynamiclinqcsharp.zip

    这是使用文本构建表达式树的更简单的替代方法。 使用代码构建表达式树更强大、更灵活但更难。

    【讨论】:

    • 我发现了这个:stackoverflow.com/questions/2789504/…。这完成了将表达式转换为字符串的工作。结合您的解决方案,它允许包含未知实体类型。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多