【问题标题】:How can i return a dataReader using Entity Framework 6.1?如何使用 Entity Framework 6.1 返回 dataReader?
【发布时间】:2015-07-10 08:31:31
【问题描述】:

正如问题所要求的那样。我的大部分代码都使用实体框架,但我还需要执行并返回不在我的实体框架上下文中的 sql 表中的计数或列。

【问题讨论】:

  • 为什么不简单地使用SqlConnection 连接字符串?
  • 您仍然可以使用 ADO.NET
  • 我目前已经在 ado.net 中使用过 SqlConnection,但我不知道创建一个新的 SqlConnection 是否正确?或者是否有一种方法可以使用 EF 连接,就好像有一个事务正在运行一样,我想使用它
  • 为什么返回不在您的 EF 上下文中的列 - 为什么不将这些表添加到上下文中?
  • 它们是动态表,我不知道它们长什么样

标签: c# asp.net .net entity-framework entity-framework-6


【解决方案1】:

您可以使用实体框架运行raw query,例如:

using (var context = new BloggingContext()) 
{ 
    var blogNames = context.Database.SqlQuery<string>( 
                       "SELECT Name FROM dbo.Blogs").ToList(); 
}

如果你想返回一个更复杂的类型,你可以定义你自己的类并使用它。只要属性与您选择的列的名称匹配,它就会起作用。所以让我们创建一个类:

public class MyClass
{
    public int Id { get; set; }
    public string UserName { get; set; }
}

并使用它:

List<MyClass> result = ctx
    .Database.SqlQuery<MyClass>("SELECT Id, UserName FROM dbo.Users")
    .ToList();

【讨论】:

  • 但是如何返回多个列?所有不同的数据类型?
  • 您可以制作自己的非实体类并使用它。检查我的编辑。
  • 问题是我不能创建一个类,因为表是动态的,我在设计时不知道这一点。我在运行时确实有列名的元数据
  • 谢谢大卫。它非常适合我的情况。
【解决方案2】:

IDataReader 的全部意义在于在数据通过线路返回时对数据进行游标(例如 TCP/IP),因此不会产生将数据全部塞入内存的开销。如果您正在处理数百万行,那么将所有内容读入内存是一个坏主意。如果是这种情况,则从 EF API 获取底层连接字符串并使用 ADO.NET。那里也有更好的 Aysnc 支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2019-08-22
    • 2014-03-28
    • 2021-05-11
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多