Linq 左联接抛出错误,指出"已有一个与此连接关联的打开的 DataReader,必须先关闭该连接。



我正试图通过在linq中执行左联接来检索列表。

但问题是连接抛出了一个错误

已经有一个打开的DataReader与此连接关联,必须首先关闭

如有任何帮助解决此问题,我们将不胜感激。非常感谢。

下面是我的linq左加入

public List<UserVsFriendVM> GetAllMessageUserList1()
{
var getList = (from mu in uow.Repository<MessageUser>().GetAll()
join f in uow.Repository<Friend>().GetAll().Where(x => x.IsConfirmed != 2) on mu.MessageUserName equals f.FriendRequestSenderName into a
from b in a.DefaultIfEmpty()
select new UserVsFriendVM
{
Id = mu.Id,
MessageUserName = mu.MessageUserName,
IsConfirmed = b == null? 0:b.IsConfirmed,
}).ToList();
return getList;
}

基于注释中提供的GetAll方法的定义,即:

public IEnumerable<T> GetAll() { return _dbset.AsEnumerable(); } 

假设所有存储库都共享数据库上下文(例如,如果它被注册为scoped(,您最终将不得不在同一上下文上同时运行查询,这将导致您得到的错误。一种解决方法是从回购中返回IQueryable

public IQueryable<T> GetAll() { return _dbset; }   

此外,此实现实际上将在数据库端执行查询,而不是在客户端执行查询,这通常会提高应用程序的性能。

基于此,我想说存储库模式在这里将是多余的(我想说,如果它与EF结合在一起通常没有用处,这仍然有待商榷(,您可以直接构建查询:

from mu in dbContext.MessageUsers // assuming the name here
join f in dbContext.Friends.Where(x => x.IsConfirmed != 2) on mu.MessageUserName equals f.FriendRequestSenderName into a
from b in a.DefaultIfEmpty()
select new UserVsFriendVM
{
Id = mu.Id,
MessageUserName = mu.MessageUserName,
IsConfirmed = b == null? 0:b.IsConfirmed,
}

相关内容

  • 没有找到相关文章

最新更新