2017-02-06 53 views
2

我使用手動滾動的ADO連接而不是EF投擲了一個原型應用程序,而現在我正在「升級」。我的一個存儲過程如下所示:如何從動態Entity Framework存儲過程返回表格字符串數據?

DECLARE @tableName NVARCHAR(999); 

SELECT @tableName = DatabaseTable 
FROM JobQueue 
WHERE JobId = @JobId; 

DECLARE @sql NVARCHAR(999); 

SET @sql = 'SELECT * FROM ' + @tableName; 

EXEC (@sql); 

現在,EF在此實例中不會了解任何關於表的信息。它可能有任意數量的任何數據類型的列。它不能被映射到一個實體,因爲它是動態的,一旦這個工作完成就不會再存在。所以查詢必須是動態的,這也意味着我無法在EF中生成返回類型。

我原來的ADO代碼只是抓住了數據,並讀入一個List<string[]>這樣的:

List<string[]> result = new List<string[]>(); 
while (dr.Read()) 
{ 
    string[] values = new string[dr.FieldCount]; 
    for (int i = 0; i < dr.FieldCount; i++) 
    { 
     values[i] = dr[i].ToString(); 
    } 
    result.Add(values); 
} 

,那就是罰款。但我無法弄清楚如何讓EF做類似的事情。我得到的最接近的是這樣的:

var query = Entities.Database 
      .SqlQuery<List<string>>("exec spGetJobData @JobId", new SqlParameter("JobId", jobId)) 
      .ToList(); 

其中返回列表中的項目的預期數量,但它們都是空的。

如何獲取我的數據?

+0

EF不適合做你在問什麼。您可以明確告訴它將結果映射到哪種類型,並且可以針對一種類型執行此操作,但不適用於各種類型。你必須在保持你的代碼和它的「動態」性質之間進行選擇。或者重寫它以使用強類型實體。 – Theo

+1

只需離開您的ADO實現(但使用Entities.Database.Connection)。它不會比通過SqlQuery做同樣的事情更糟糕。 – Evk

+0

@太抱歉了,我沒有說清楚。在這種情況下,我很樂意把所有東西當作一個字符串。換句話說,我不在乎原始表格中的數據類型是什麼,爲了我的目的,它們都可以表示爲字符串。但顯然他們需要成爲名單或列表或somesuch列表。 –

回答

1

EF希望爲所有數據庫返回指定強類型,並且只允許1對1映射。所以簡短的答案是EF不會支持你想要的。看來你的選擇是重寫你的代碼來使用EF或保持原樣。

相關問題