2010-02-10 3 views
1

У меня есть список, который включает IQueryAble внутри как свойство. Я передаю список в мой проект в MVC. Я перебираю список, используя foreach. Внутри Еогеасп:Проблема с материализованным результатом запроса - LINQ

Альбомы в виде списка

<% foreach(var x in Albums){%> 

<h1><%= x.Title %></h1> 
<p><%= x.Photos.Count() %> </p> 

<%}%> 

Отображение Название не является проблемой, но он выдает ошибку, как только он попадает в Count(): «Этот метод не поддерживается против материализованный результат запроса ".

Что это значит? У меня нет коллекции внутри коллекции? как только я повторяю сборку, другая коллекция внутри этого класса больше не используется.

спасибо

ответ

1

Используйте модель представления:

public class AlbumPresentation 
{ 
    public string Title { get; set; } 
    public int PhotoCount { get; set; } 
} 

Тогда project onto the model в контроллере:

var model = (from a in Context.Albums // or, more likely, via a repository 
      select new AlbumPresentation 
      { 
       Title = a.Title, 
       PhotoCount = a.Photos.Count() 
      }).ToList(); 
return View(model); 

Тип вашего View теперь ViewPage<IEnumerable<AlbumPresentation>>.

Обратите внимание, что в отличие от использования активной загрузки (Include()) вам больше не требуется загружать все записи из базы данных только для получения счета. Вы можете загрузить эту информацию, если вам это нужно, но только если вам это нужно.

+0

Я думаю, что это сработает, но мне нужно изменить подстилающую модель. Я использую презентационную модель. В моей модели представления у меня есть эта общественного класса AlbumViewModel { Публичный список MyAlbums {получить, установить:}} внутри каждого из альбома есть фотографии.Похоже, я не могу выполнять операцию расширения Linq изнутри коллекции, которую я выполняю. Просто не видишь причину. – dritterweg

+0

Вам нужно только изменить свою модель, чтобы добавить к ней одно свойство 'int' (для подсчета). Что касается, почему, я думаю, что есть еще код, который вы нам не показываете. «Материализованный результат запроса?» Ваши теги говорят EF, но это звучит как L2S для меня. –

0

Я думаю, что вам нужно будет включить Фотографии в свой запрос. Что-то вроде.

var Albums = from a in context.Ablums.Include("Photos") select a; 
+0

сборник фото уже включен, если я его отлаживаю, я вижу его в своем контроллере, но как только я повторяю альбомы и пытаюсь подсчитать фотографии внутри альбома (внутри итерации), он бросает эту ошибку. – dritterweg

3

У меня просто был этот вопрос, и я и googling не помогли. Я выяснил самый простой способ исправить код. Просто добавьте .ToList() перед .Count(), и он будет работать нормально.

<% foreach(var x in Albums){%> 

<h1><%= x.Title %></h1> 
<p><%= x.Photos.ToList().Count() %> </p> 

<%}%> 

Коллекция внутри коллекции еще не оценена, поэтому вы не можете ее подсчитать. Я предполагаю, что он пытается сохранить время выполнения, если вы не используете внутреннюю коллекцию.

пример:

var result = (from tsk in db.Tasks 
       where tsk.result == "Success" 
       orderby tsk.data_end descending 
       select new 
       { 
        tsk.data_end, 
       //here's an inner collection 
        nodes = (from err in db.Errors 
           where err.QueryEnd == tsk.data_end 
           select err.NodeName).Distinct() 
       }).ToList(); 

result.nodes еще не оценили, потому что не .toList() на нем. Если вы попытаетесь добавить это, это вызовет исключение.

result.nodes [0] .Count() выдаст ошибку.

result.nodes [0] .ToList(). Count() будет успешным.

Смежные вопросы