3

我不确定这是否可能。我可能正在尝试使用错误的工具来完成我正在尝试做的工作。

假设我想做以下事情:

我执行了一个名为“GetTableName”的函数,它返回我想要从中获取数据的 SQL 表的名称。

我执行另一个名为“GetFields”的函数,它返回 SQL 表中一个或多个字段的名称。

我希望能够编写另一个函数,该函数将返回一个 DataSet(或其他一些通用对象),其中包含“GetTableName”指定的表中的行以及“GetFields”指定的字段

我知道我可以使用旧的 ADO.net 界面来做到这一点,但是有没有合适的方法来使用实体框架来做到这一点?

需要强调的是,代码在编译时不会知道从 SQL 返回的数据的形状。

4

2 回答 2

4

根据规则,您不应在 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;
    }
于 2016-02-24T16:56:22.757 回答
3

由于 EF 需要映射到复杂类型,因此可能可以编写一个继承自 ExpandoObject 的类,然后您可以(通过大量编码)映射到 DataTable 类或按原样使用。然后你基本上需要告诉 EF 以某种方式尝试映射到这些属性。但是,我认为这将是一段漫长而曲折的代码、重载和基本重写 EF:s 对象映射的核心功能的旅程。

正如你在这个例子中看到的那样,作者动态创建模型,困难仍然存在;根据数据自动生成属性的部分: http://www.markzhou.com/blog/post/2011/06/02/Use-dynamic-type-in​​-Entity-Framework-41-SqlQuery() -方法.aspx

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

于 2013-07-16T21:46:48.393 回答