2013-07-17 67 views
0

我爲我的應用程序創建數據訪問層時遇到了問題。我正在使用實體框架中的派生實體。如果我嘗試爲派生實體創建一個ObjectSet,我得到以下例外:實體框架非泛型在動態ObjectSet上包含

Blockquote沒有爲指定的實體類型「類型名稱」定義EntitySets。如果「類型名稱」是派生類型,請改爲使用基本類型。

我試圖通過反射來解決這個問題。 (如果實體類型由實體類型派生=>獲得基類型的ObjectSet)

我發現這個:How can I obtain ObjectSet<T> from Entity-Framework at runtime where T is dynamic?但我還沒有找到如何使用Include和Where構建ObjectSet。

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中使用動態表達式?

在此先感謝。

回答

1

問題看起來是與

查詢= query.Include(包括);

的變種包括將是一個Expression<Func<dynamic,dynamic>>

的方法包括訪問期待一個stringExpression<Func<T, TProperty>>

您是否嘗試過通過包括作爲一個字符串的路徑?我希望這能起作用。

否則,你需要 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

這是使用文本來構建表達式樹的更簡便的方法來找到。 使用代碼構建表達式樹更強大,更靈活但更難。

+0

我發現這個:http://stackoverflow.com/questions/2789504/get-the-property-as-a-string-from-an-expressionfunctmodel-tproperty。這可以將表達式轉換爲字符串。結合您的解決方案,它允許包含未知的EntityType。非常感謝。 –