C# 我正在使用linq,我得到了一个错误;已经有一个打开的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)

在这段代码中,我在foreach循环blog之前一直在获取值,但随后我得到了错误

已存在与此命令关联的打开的datareader,必须先关闭该命令

您需要启用

修改连接字符串以启用
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