C# 错误:已存在与此命令关联的打开的DataReader,必须先关闭它

C# 错误:已存在与此命令关联的打开的DataReader,必须先关闭它,c#,asp.net,sql,C#,Asp.net,Sql,我正在使用sql连接访问数据库中的不同表。但是,代码返回以下错误 错误:“已经有一个与此命令关联的打开的DataReader,必须先关闭它”: MyContext conn = new MyContext() protected void ChangeName(int id) { User user = conn.MyOtherTable.First(x => x.id == id); var elements = conn.MyTable.Where(x =>

我正在使用sql连接访问数据库中的不同表。但是,代码返回以下错误

错误:“已经有一个与此命令关联的打开的DataReader,必须先关闭它”

MyContext conn = new MyContext()

protected void ChangeName(int id)
{
    User user = conn.MyOtherTable.First(x => x.id == id);

    var elements = conn.MyTable.Where(x => x.id == id && x.name == name).OrderBy(x => x.id).OrderBy(x => x.name).
                    .Select(t => new { t.id, t.name, }).GroupBy(t => new { t.id, t.name, });

                foreach (var item in elements)
                {
                    foreach (var row in item)
                    {
                        for (int j = 1; j <= 5; j++)
                        {
                            if (row.name == "name")
                            {
                                user.name1 = row.name;
                                conn.SaveChanges();
                            }
                            if (row.name == "name2")
                            {
                                user.name2 = row.name;
                                conn.SaveChanges();
                            }
                         }
                     }
            }
 }
MyContext conn=new MyContext()
受保护的void ChangeName(int-id)
{
User User=conn.MyOtherTable.First(x=>x.id==id);
var elements=conn.MyTable.Where(x=>x.id==id&&x.name==name).OrderBy(x=>x.id).OrderBy(x=>x.name)。
.Select(t=>new{t.id,t.name,}).GroupBy(t=>new{t.id,t.name,});
foreach(元素中的变量项)
{
foreach(项目中的var行)
{
for(int j=1;jLINQ(与数据库对话时)通常是一个非缓冲假脱机API。要执行您想要的操作,请执行以下任一操作:

  • 启用多个活动结果集(MARS)
  • 先缓冲数据
我更喜欢第二个选项;它只需要在第一行中添加
.ToList()

var elements = conn.MyTable.Where(x => x.id == id && x.name == name)
        .OrderBy(x => x.id).OrderBy(x => x.name).
        .Select(t => new { t.id, t.name, }).GroupBy(t => new { t.id, t.name, })
        .ToList();
现在,在这行运行之后,我们知道内存中已经有了所有的数据,并且读卡器已经关闭;之前,它可能仍然在谈论来自读卡器的行输入


为了完整性,-这不是我的建议。

我在计算错误时计算错误,但我启用了多个活动结果集(MARS),最后我只是将IDateReader变量方法从close()更改为dispose(),然后问题消失了。

您能解释为什么LINQ默认为非缓冲假脱机API吗?