【问题标题】:DataReader must be closed First and my LINQ Query必须先关闭 DataReader,然后我的 LINQ 查询
【发布时间】:2013-03-19 11:05:09
【问题描述】:

我正在尝试使用 LINQ 从我的数据库中使用 EF 选择一堆 Name 对象。问题是我收到一个错误:

已经有一个打开的 DataReader 与此命令关联 必须先关闭。

Project 是一个包含有关该项目的信息的类型。它是名称类的导航属性。我的 LINQ 查询有什么问题导致此错误。

var allNames = from n in _db.DCENames
               orderby n.BrandName ascending
               select n;

foreach (Name name in allNames)
{
    NameDbModel data = new NameDbModel();
    data.id = name.Id;
    data.BrandName = name.BrandName; 
    data.MarkType = name.Project.MarkType;
    data.DateAdded = name.DateAdded;
    data.PrimarySector = name.Project.PrimarySector;
    data.ProjectName = name.Project.ProjectName; 
    data.Status = name.Project.ProjectStatus;
    data.ProjectId = name.Project.ProjectId;
    data.Notes = "";
    model.Add(data);
}

【问题讨论】:

标签: c# linq


【解决方案1】:

LINQ 查询不会获取数据,它只会创建一个可以获取数据的枚举,因此数据读取器会一直打开,直到您获取最后一项。

在使用前使用ToList方法将所有记录读入一个列表:

foreach (Name name in allNames.ToList())

【讨论】:

  • 这可能会导致列表的多次枚举,最好他将查询括在括号中,然后调用.ToList()。 +1 用于延迟执行的解释。
  • ToList 可以在内存中创建一个非常大的结构,具体取决于返回的行数。最好在初始查询中包含子记录并仅枚举结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
相关资源
最近更新 更多