我正在尝试使用linq过滤一些对象,但是我收到一个错误,告诉我“枚举没有产生任何结果”。
在客户端我收到这样的消息:
由于DbContext已经完成,因此无法完成操作 设置
我知道这些过滤器值应该返回一些结果,但它不起作用,所以我猜测我的查询是错误的,你能帮忙吗。
var mediaChannels =
NeptuneUnitOfWork.MediaChannels
.FindWhere(m => m.CountryID == CountryID &&
m.SonarMediaTypeID == MediaTypeID &&
m.SonarMediaTypes.SonarMediaGroupID == MediaGroupID &&
m.Name.Contains(search))
.Select(m => new MediaChannelModel() {
ID = m.ID,
Name = m.Name,
MediaType = m.MediaType.Name,
Country = m.Countries.Name,
SubRegion = m.Countries.Lookup_SubRegions.Name,
Region = m.Countries.Lookup_SubRegions.Lookup_Regions.Name
});
答案 0 :(得分:12)
我的猜测是运行得很好,然后你处理上下文,然后你尝试访问mediaChannels
。问题是Linq使用延迟执行。因此,在枚举mediaChannels
之前,查询才会真正执行,这是在您处理上下文之后。
如果您不想使用延迟执行,请在查询末尾添加.ToList()
以强制它在那里加载。
如果您想使用延迟执行,那么您不能在以后的某个时间点处理您的上下文。
答案 1 :(得分:4)
The operation cannot be completed because the DbContext has been disposed
。在将查询发送到页面
.ToList()
轻松修复此问题
var mediaChannels = NeptuneUnitOfWork.MediaChannels
.Where(m => m.CountryID == CountryID
&& m.SonarMediaTypeID == MediaTypeID &&
&& m.SonarMediaTypes.SonarMediaGroupID == MediaGroupID
&& m.Name.Contains(search))
.Select(m => new MediaChannelModel() {
ID = m.ID,
Name = m.Name,
MediaType = m.MediaType.Name,
Country = m.Countries.Name,
SubRegion = m.Countries.Lookup_SubRegions.Name,
Region = m.Countries.Lookup_SubRegions.Lookup_Regions.Name
}).ToList(); // <<-- NOTE this additional method