2013-07-16 48 views
1

我不確定這是否可能。我可能會嘗試使用錯誤的工具來完成我想要做的工作。如何獲取DataSet作爲實體框架5.0中查詢的結果?

假設我要做到以下幾點:

我執行被稱爲「getTableName時」,它返回一個SQL表我希望從中獲取數據的名稱功能。

我執行另一個名爲「GetFields」的函數,它返回SQL表中一個或多個字段的名稱。

我希望能寫會返回一個包含從「getTableName時」指定由「GetFields」

我知道指定的字段的錶行的數據集(或其他一些通用的對象),另一個函數我可以使用舊的ADO.net接口來做到這一點,但是有沒有一種適當的方法可以用Entity Framework來做到這一點?

爲了強調,代碼將而不是在編譯時知道從SQL返回的數據的形狀將是什麼。

+0

爲什麼不直接使用ADO?如果EF在設計時不知道表格定義,那麼爲什麼使用EF? – Paparazzi

+0

即使我不想使用實際的實體類,我也發現它對於處理連接和其他所有事情的方式也非常有用。 –

回答

3

由於EF需要複雜類型映射到,所以可能編寫一個從ExpandoObject繼承的類,然後您可以(具有大量編碼)映射到DataTable類或按原樣使用。那麼你基本上需要告訴EF以某種方式嘗試映射到這些屬性。然而,我認爲這將是一段漫長而曲折的代碼之旅,重載並基本重寫EF:s對象映射的核心功能。如你在這個例子中看到的那樣,作者動態地創建模型,硬仍然存在;基於數據自動生成屬性的部分: http://www.markzhou.com/blog/post/2011/06/02/Use-dynamic-type-in-Entity-Framework-41-SqlQuery()-method.aspx

如果您需要DataTable,我真的建議您使用ADO.NET。

2

通過規則,您不應該在EF應用程序中使用DataSet。但是,如果您真的需要(例如,提供報告),該解決方案應該可以工作(它是EF 6代碼):

DataSet GetDataSet(string sql, CommandType commandType, Dictionary<string, Object> parameters) 
    { 
     // creates resulting dataset 
     var result = new DataSet(); 

     // creates a data access context (DbContext descendant) 
     using (var context = new MyDbContext()) 
     { 
      // creates a Command 
      var cmd = context.Database.Connection.CreateCommand(); 
      cmd.CommandType = commandType; 
      cmd.CommandText = sql; 

      // adds all parameters 
      foreach (var pr in parameters) 
      { 
       var p = cmd.CreateParameter(); 
       p.ParameterName = pr.Key; 
       p.Value = pr.Value; 
       cmd.Parameters.Add(p); 
      } 

      try 
      { 
       // executes 
       context.Database.Connection.Open(); 
       var reader = cmd.ExecuteReader(); 

       // loop through all resultsets (considering that it's possible to have more than one) 
       do 
       { 
        // loads the DataTable (schema will be fetch automatically) 
        var tb = new DataTable(); 
        tb.Load(reader); 
        result.Tables.Add(tb); 

       } while (!reader.IsClosed); 
      } 
      finally 
      { 
       // closes the connection 
       context.Database.Connection.Close(); 
      } 
     } 

     // returns the DataSet 
     return result; 
    }