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();
其中返回列表中的項目的預期數量,但它們都是空的。
如何獲取我的數據?
EF不適合做你在問什麼。您可以明確告訴它將結果映射到哪種類型,並且可以針對一種類型執行此操作,但不適用於各種類型。你必須在保持你的代碼和它的「動態」性質之間進行選擇。或者重寫它以使用強類型實體。 – Theo
只需離開您的ADO實現(但使用Entities.Database.Connection)。它不會比通過SqlQuery做同樣的事情更糟糕。 – Evk
@太抱歉了,我沒有說清楚。在這種情況下,我很樂意把所有東西當作一個字符串。換句話說,我不在乎原始表格中的數據類型是什麼,爲了我的目的,它們都可以表示爲字符串。但顯然他們需要成爲名單或列表或somesuch列表。 –