我在为我的应用程序创建数据访问层时遇到了问题。我正在使用实体框架中的派生实体。如果我尝试为派生实体创建 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 中使用动态表达式?
提前致谢。