C# 我正在使用linq,我得到了一个错误;已经有一个打开的datareader与此命令关联,必须先关闭该命令";
在这段代码中,我在foreach循环blog之前一直在获取值,但随后我得到了错误 已存在与此命令关联的打开的datareader,必须先关闭该命令 您需要启用 修改连接字符串以启用C# 我正在使用linq,我得到了一个错误;已经有一个打开的datareader与此命令关联,必须先关闭该命令";,c#,.net,linq,C#,.net,Linq,在这段代码中,我在foreach循环blog之前一直在获取值,但随后我得到了错误 已存在与此命令关联的打开的datareader,必须先关闭该命令 您需要启用 修改连接字符串以启用MultipleActiveResultSets dc.Accounts.Where(a => blogs.Select(b => b.AccountID).Distinct() .Contains(a.AccountID)); foreach (Blog blog in blogs)
MultipleActiveResultSets
dc.Accounts.Where(a => blogs.Select(b => b.AccountID).Distinct()
.Contains(a.AccountID));
foreach (Blog blog in blogs)
{
blog.Account = accounts.Where(a => a.AccountID == blog.AccountID)
.FirstOrDefault();
//this is done to access account outside ObjectContext
blog.account = blog.Account;
}
由于您正在访问循环中的某些导航属性,因此可能会遇到Select N+1
问题。您可以通过快速加载来避免这种情况
例如:
这通常是在有外部查询和内部查询且外部查询仍在运行时引起的。通常,您可以通过强制外部查询完成来解决此问题;只需添加
ToList()
通常就足够了:
dc.Accounts.Include("Blogs").Where(a => blogs.Select(b => b.AccountID).Distinct()
.Contains(a.AccountID));
var blogs=dc.Accounts.Where(a=>blogs.Select(b=>b.AccountID.Distinct())
.Contains(a.AccountID)).ToList();//我不确定,但它闻起来有N+1 SQL问题;我会在其他修复之前检查它;这真的有必要吗?{1,1,2,3}.Contains(1)
和{1,1,2,3}.Contains(4)
的答案分别与{1,2,3}.Contains(1)
和{1,2,3}.Contains(4)
相同。
dc.Accounts.Include("Blogs").Where(a => blogs.Select(b => b.AccountID).Distinct()
.Contains(a.AccountID));
var blogs = dc.Accounts.Where(a => blogs.Select(b => b.AccountID).Distinct()
.Contains(a.AccountID)).ToList(); // <======= here