让IQueryable <int>集合在foreach循环中工作的奇怪问题</int>

时间:2011-05-07 12:17:14

标签: c# entity-framework iqueryable

我正在构建一个存储库方法(实体框架),以接收由表单中的复选框提供的ID集合作为CMS的一部分,并更新将主题与发布相关联的查找表(实体集)。 p>

我在存储库中有这个方法:

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

}

第一个foreach循环上的AttachToTopics扼流圈,产生此错误消息:

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中,我的topicsToAdd集合没有被填充,并且其在调试中的结果视图包含上述错误消息。

奇怪的是,如果我为previousAssociatedTopics切换手动生成的IQueryable整数集合(请参阅上面的代码中的注释),foreach循环可以正常工作。所以我相信我需要找到一些其他方法来从我的存储库中的方法调用中使用int填充priorAssociatedTopics。

有任何线索吗?

1 个答案:

答案 0 :(得分:3)

在这种情况下,ListTopicIdsForPublication是否有任何理由无法返回IEnumerable<int>IList<int>?如果是这样,在.ToList()末尾添加topics.Select(t => t.ID)将确保查询在该点运行。

导致问题的不是IQueryable<int>,而是来自IQueryable<int>的{​​{1}}。看起来它正在丢失它的上下文数据信息,这就是你获得异常的原因。