9

我正在尝试使用 linq to enitites 过滤一些对象,但我收到一条错误消息,告诉我“枚举没有产生任何结果”。

在客户端,我收到这样的消息:

操作无法完成,因为 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
      });
4

2 回答 2

14

我的猜测是这运行得很好,然后你处理你的上下文,然后你尝试访问mediaChannels. 问题是 Linq 使用延迟执行。因此,在您 enumerate 之前,您的查询不会真正执行mediaChannels,这是在您处理上下文之后。

如果您不想使用延迟执行,.ToList()请在查询末尾添加 a 以强制它在此处加载。

如果您想使用延迟执行,那么您不能在稍后处理您的上下文。

于 2013-07-12T15:30:13.040 回答
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
于 2013-07-12T15:32:05.410 回答