Любопытная проблема с получением коллекции IQueryable <int>в цикле foreach - PullRequest
2 голосов
/ 07 мая 2011

Я создаю метод репозитория (Entity Framework) для получения коллекции идентификаторов, предоставляемых флажками в форме как часть CMS, и обновляю таблицу поиска (набор сущностей), которая связывает темы с публикациями.

У меня есть этот метод в репозитории:

public void AttachToTopics(int pubId, IQueryable<int> topicsForAssociation, IQueryable<int> topicsSubset, int primaryTopicId)

{

    // EVERYTHING IS FINE IF I INSERT A MANUAL COLLECTION  OF int LIKE THIS:
    // var priorAssociatedTopics = new[] { 2 }.AsQueryable();  // 

    // BUT WHAT I REALLY NEED TO WORK IS THIS:  
    IQueryable<int> priorAssociatedTopics = ListTopicIdsForPublication(pubId);

    var priorAssociatedTopicsToExamine = priorAssociatedTopics.Intersect(topicsSubset);

    var topicsToAdd =
        associatedTopics.Intersect(topicsSubset).Except(priorAssociatedTopicsToExamine);

    foreach (var topicToAdd in topicsToAdd)
        AttachToTopic(pubId, topicToAdd);


    foreach (var topicToRemove in priorAssociatedTopicsToExamine.Except(associatedTopics))
        DetachFromTopic(pubId, topicToRemove);

}

Дроссели AttachToTopics в первом цикле foreach, приводящие к этому сообщению об ошибке:

This method supports the LINQ to Entities infrastructure and is not intended to be used directly from your code.

Но проблема действительно впервая строка: метод репозитория, вызываемый в этой строке, обеспечивает соответствующую типизированную коллекцию в priorAssociatedTopics, и у Intellisense нет проблем с явной типизацией его как IQueryable (обычно я бы использовал var), а отладчик показывает, что эта переменная содержит коллекциюцелые числа.

public IQueryable<int> ListTopicIdsForPublication(int pubId)
{
    var topics = from x in DataContext.TopicPublications where x.PublicationId == pubId  select x;
    return topics.Select(t => t.Id);
}

Однако обратно в attachToTopics моя коллекция themesToAdd не заполняется, и ее Представление результатов в отладке содержит вышеупомянутое сообщение об ошибке.

Любопытно, если я переключаюсь ввручную сгенерированная коллекция IQueryable для priorAssociatedTopics(см. комментарий в коде выше) цикл foreach работает нормально.Поэтому я полагаю, что мне нужно найти какой-то другой способ получить priorAssociatedTopics, заполненный целыми числами, из вызова метода в моем хранилище.

Есть какая-нибудь подсказка?

1 Ответ

3 голосов
/ 07 мая 2011

Есть ли причина, по которой ListTopicIdsForPublication не может вернуть IEnumerable<int> или IList<int> в этом случае? Если это так, добавление .ToList() в конце topics.Select(t => t.ID) обеспечит выполнение запроса в этой точке.

Проблема не столько в том, что это IQueryable<int>, а в IQueryable<int> от DataContext.TopicPublications. Похоже, что он теряет свою контекстную информацию, и именно поэтому вы получаете исключение.

...