【问题标题】:How can I return a datareader when using Entity Framework 4?使用 Entity Framework 4 时如何返回数据读取器?
【发布时间】:2014-03-29 07:37:34
【问题描述】:

我想使用 LINQ 和我的 EntityFramework 上下文定义数据库查询,但我不希望返回实体;我想要一个数据阅读器!

我该怎么做?这用于将行导出到 CSV。

干杯,伊恩。

【问题讨论】:

  • 为什么不直接获取对象并将其序列化为 CSV?
  • 我不知道会有多少对象,所以数据读取器会阻止服务器的内存填满。
  • 环顾四周,您可能无法轻松获得它,有一个ExecuteDbDataReader 方法,但它受到保护,因此您可能不应该试图抓住它.如果不经常这样做和/或查询不是过于昂贵,则可以尝试对查询结果进行分页,以确保一次没有太多对象在内存中。

标签: entity-framework ado.net entity-framework-4.1


【解决方案1】:

如果你需要这个,你很可能会做一些意想不到的事情。通过查询的具体化结果进行简单迭代应该是您所需要的——这就是 ORM 方式。如果您不喜欢它,请直接使用SqlCommand

DbContext API 被简化,因此它不包含 ObjectContext API 中可用的许多功能。访问数据阅读器就是其中之一。您可以尝试将DbContext 转换为ObjectContext 并使用更复杂的API:

ObjectContext objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
using (var connection = objContext.Connection as EntityConnection)
{
    // Create Entity SQL command querying conceptual model hidden behind your code-first mapping
    EntityCommand command = connection.CreateCommand();
    command.CommandText = "SELECT VALUE entity FROM ContextName.DbSetName AS entity";
    connection.Open();
    using (EntityDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess))
    {
        ...
    }
}

但是纯粹的 ADO.NET 方式更容易和更快,因为前一个示例仍然使用查询到 SQL 查询的映射:

using (var connection = new SqlConnection(Database.Connection.ConnectionString))
{
    SqlCommand command = connection.CreateCommand();
    command.CommandText = "SELECT * FROM DbSetName";
    connection.Open();
    using(SqlDataReader reader = command.ExecuteReader())
    {

    }
}

【讨论】:

  • “如果你需要这个,你很可能会做一些意想不到的事情。”我不认为请求大量对象以进行导出或生成电子邮件有什么特别奇怪的。 ORM 仍然可以物化对象,但以纯数据读取器的方式从数据库中流式传输它们。 LLBLGen 允许人们获取数据阅读器。 llblgen.com/documentation/2.6/Using%20the%20generated%20code/…
【解决方案2】:

这个问题是关于 EF 4 的,但对于其他任何 EF 6 或更高版本的人,您可以使用 AsStreaming() 扩展方法。

http://msdn.microsoft.com/en-us/library/dn237204(v=vs.113).aspx

【讨论】:

  • 对于任何像我一样但不知道 AsStreaming() 做什么的人,这是我能够找到的唯一传递参考:entityframework.codeplex.com/…。任何地方似乎都没有其他文档。
  • 这个方法现在已经过时并且调用它没有任何效果,因为默认情况下 LINQ 查询是流式的。不过,我猜这仅适用于 EF6。您仍然应该使用 Ladislav 对 EF4 的回答。
猜你喜欢
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多