C# 如何从动态实体框架存储过程返回表格字符串数据?

C# 如何从动态实体框架存储过程返回表格字符串数据?,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我使用手动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); List<

我使用手动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);
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不会知道关于表的任何信息。它可能有任意数量的任何数据类型的列。无法将其映射到实体,因为它是动态的,并且在完成此作业后将不再存在。所以查询必须是动态的,这也意味着我不能在EF中生成返回类型

我最初的ADO代码只是抓取数据并将其读入一个
列表
,如下所示:

DECLARE @tableName NVARCHAR(999);

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

DECLARE @sql NVARCHAR(999);

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

EXEC (@sql);
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);
}
列表结果=新列表();
while(dr.Read())
{
字符串[]值=新字符串[dr.FieldCount];
对于(int i=0;i
那很好。但我不知道如何让EF做类似的事情。我得到的最接近的结果是:

var query = Entities.Database
            .SqlQuery<List<string>>("exec spGetJobData @JobId", new SqlParameter("JobId", jobId))
            .ToList();
var query=Entities.Database
.SqlQuery(“exec spGetJobData@JobId”,新的SqlParameter(“JobId”,JobId))
.ToList();
返回列表中预期的项目数,但所有项目均为空


如何获取数据?

EF希望所有数据库返回都具有强定义类型,并且只允许1对1映射。所以简单的回答是EF不会支持你想要的。您的选择似乎是重新编写代码以使用EF或保持原样。

EF不能满足您的要求。您可以显式地告诉它将结果映射到什么类型,并且它可以对一种类型进行映射,但不能对多种类型进行映射。您必须在保留代码和代码的“动态”性质之间做出选择。或者重写它以使用强类型实体。只需保留ADO实现(但使用entities.Database.Connection)。这不会比通过SqlQuery执行同样的操作更糟糕。@Theo抱歉,我没有说清楚。在这种情况下,我很乐意把一切都当作一根弦。换句话说,我不在乎原始表中的数据类型是什么,出于我的目的,它们都可以表示为字符串。但很明显,它们需要是一个列表或列表列表之类的东西。@Mattstrower我明白,但EF不能做你想做的事。你要么重写它以使用EF类型,要么保持你的实现不变。@Theo-仅供参考,如果你想把你的评论编译成一个简短的答案,我会接受的。