我使用手动ADO连接而不是EF将原型应用程序整合在一起,我现在正在“升级”。我的一个存储过程如下所示:
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 :(得分:1)
EF希望为所有数据库返回提供强定义类型,并且只允许1对1映射。所以简短的回答是EF不会支持你想要的东西。您似乎可以选择重新编写代码以使用EF或保持原样。