2012-06-25 76 views
0

我有一個從第三個源導入數百個表的數據庫。使用實體框架,這些表成爲標記爲E_1,E_2,E_3的ObjectSets ...所有表都有一組公共的列,可以使用一個函數查詢。實體框架和泛型類型參數

我有以下代碼:

namespace Foo{ 
    public static class Data{ 

     public static MyEntities dataContext = new MyEntities(); 

     public static void getData<T>(string entityName) where T : class 
     { 
      string queryString = "SELECT result FROM "; 
      queryString += Data.dataContext.DefaultContainerName + "." + entityName; 

      ObjectQuery<T> myQuery = Data.dataContext.CreateQuery<T>(queryString, null); 

     // do stuff 
     } 

     public static void test(){ 
     string entityName = "E_1"; 
     Data.getData<E_1>(entityName); 
     } 
} 

在試驗(),我通過字符串 「E_1」 給函數的getData()和I也插入型類Foo.E_1成的getData <>如泛型類型參數。

實際上,E_1直到運行時才知道。在運行時,我創建了entityName字符串,但是如何將此字符串轉換爲getData <>所需的通用參數類型?

謝謝。

+0

您需要確保E_1是一個類,才能將其用作泛型約束/參數 – Kane

回答

0

所有的桌子都有一個共同的組列

,這樣就可以使一個類(如MyImportType)捕捉到你的查詢結果,並在ObjectQuery

代替使用 ExecuteStoreQuery
var data = Data.dataContext.ExecuteStoreQuery<MyImportType>(queryString); 

而getData不需要泛型類型參數。

另外:我同意TomTom的db設計非常糟糕。如果可以的話,至少將具有相同列的表合併到一個表中。

+0

謝謝,這個工作很好! (數據庫設計並不像看起來那麼糟糕,爲了解決這個問題,我簡化了它。) – user1326717

0

在現實中,E_1不知道,直到運行時

Anjd現實是:

  • 非常不好的數據庫設計,而不是由實體框架支持
  • 東西。

這樣簡單。