我正试图通过在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,
}