【问题标题】:How can I get a DataSet as the result of a query in Entity Framework 5.0?作为 Entity Framework 5.0 中的查询结果,如何获取 DataSet?
【发布时间】:2013-07-15 04:58:28
【问题描述】:

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

假设我想做以下事情:

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

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

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

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

强调一下,代码在编译时将知道从 SQL 返回的数据的形状。

【问题讨论】:

  • 为什么不直接使用 ADO?如果 EF 在设计时不知道表定义,那么为什么要使用 EF?
  • 即使我不想使用实际的实体类,我发现它对于处理连接和其他一切的方式对我来说也非常有用。

标签: .net sql database entity-framework dataset


【解决方案1】:

根据规则,您不应在 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;
    }

【讨论】:

    【解决方案2】:

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

    正如您在此示例中所见,作者动态创建模型,但仍然存在困难;根据数据自动生成属性的部分: http://www.markzhou.com/blog/post/2011/06/02/Use-dynamic-type-in-Entity-Framework-41-SqlQuery()-method.aspx

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

    【讨论】:

      猜你喜欢
      • 2021-05-18
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多