2013-07-12 106 views
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 
     }); 
+0

是'NeptuneUnitOfWork.MediaChannels'運行起來之前容易解決嗎? – jp2code

+0

謝謝你們,我不得不添加一個ToList(),而且我的sql測試是錯誤的,所以沒有匹配的數據。 – Xerxes

回答

9

我的猜測是,這運行得很好,然後你處置你的上下文,然後你嘗試訪問mediaChannels。問題在於Linq使用延期執行。因此,只有在枚舉mediaChannels之後,查詢纔會真正執行,這是在您處理上下文之後。

如果您不想使用延遲執行,請在查詢末尾添加.ToList()以強制其在該處加載。

如果您想要使用延遲執行,那麼在稍後的點之前您不能處理您的上下文。

2

The operation cannot be completed because the DbContext has been disposed經常出現如果您發送數據到客戶端而不將數據保存到內存。這可以通過.ToList() -ing查詢其發送到頁面

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