2013-07-12 3 views
4

Я пытаюсь отфильтровать некоторые объекты с помощью linq для enitites, и я получаю сообщение об ошибке «Enumeration не дал никаких результатов».Перечисление не дало результата?

на стороне клиента я получаю сообщение, как это:

Операция не может быть завершена, поскольку 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() -ную запрос перед отправкой его на страницу

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