枚举没有结果?

时间:2013-07-12 15:16:01

标签: linq entity-framework-4

我正在尝试使用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
      });

2 个答案:

答案 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