Проблема с материализованным результатом запроса - LINQ - PullRequest
1 голос
/ 10 февраля 2010

У меня есть список, включающий IQueryAble внутри как свойство. Я передаю список в мой вид в проекте MVC. Я перебираю Список, используя foreach. Внутри foreach:

Альбомы по типу списка

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

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

<%}%>

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

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

спасибо

Ответы [ 3 ]

3 голосов
/ 06 июня 2012

У меня просто была эта проблема, и поиск в Google не помог.Я выяснил самый простой способ исправить код.Просто добавьте .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 () будет успешным.

1 голос
/ 10 февраля 2010

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

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

Затем проецируется на модель в вашем контроллере:

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);

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

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

0 голосов
/ 10 февраля 2010

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

var Albums = from a in context.Ablums.Include("Photos") select a;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...