0

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

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

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

我发现了这一点:如何在 T 是动态的运行时从 Entity-Framework 获取 ObjectSet<T>? 但我还没有找到如何在构建的 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-Parameter)。
有没有办法在通用 ObjectSet 中使用动态表达式?

提前致谢。

4

1 回答 1

1

问题似乎与

查询 = 查询。包括(包括);

var include 将是Expression<Func<dynamic,dynamic>>

您访问的包含方法需要一个stringExpression<Func<T, TProperty>>

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

否则,您需要使用代码构造表达式树, 因为您无法将动态对象传递给

 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。压缩

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

于 2013-07-17T14:59:07.860 回答