Невозможно изменить свойства объектов в IEnumerable <T> - PullRequest
2 голосов
/ 30 ноября 2010

У меня проблема с внесением изменений в свойства объектов в коллекции IEnumerable.Я передаю коллекцию другому методу, чтобы удалить дублирующую информацию между сущностями в коллекции.Это работает внутри метода, но как только метод завершается, выполняется и возвращается вызывающей стороне, изменения теряются.Однако, если я преобразую IEnumerable в список, он будет работать как положено.Мое единственное предположение состоит в том, что, когда я вызываю ToList, он становится конкретным типом, и это позволяет ему работать, но это не должно быть ограничением, верно?

Также ничего не стоит, что это неконтекст отложенного исполнения. Это оказалось неправдой, компилятор переписывал метод RetrieveTrackingFilters, чтобы воспользоваться преимуществом отложенного выполнения

Это сокращенный код:

public IEnumerable<TrackingFilter> RetrieveTrackingFilters(string proNumber)
{
    var trackingFilters = new EntityCollection<TrackingOverviewFilterEntity>(new TrackingOverviewFilterEntityFactory());

    var filter = new RelationPredicateBucket();
    filter.Relations.Add(TrackingOverviewFilterEntity.Relations.TrackingOverviewEntityUsingTrackingOverviewId);
    filter.PredicateExpression.Add(TrackingOverviewFields.ProNumber == proNumber);

    DataAccessAdapterFactory.Instance().FetchEntityCollection(trackingFilters, filter);

    return BuildTrackingFilterColl(trackingFilters); //Just news up a DTO object and populates it
}

public TrackingSummaryViewModel RetrieveTrackingSummary(string proNumber)
{
    ...
    var trackingFilters = this._TrackingOverviewDataController.RetrieveTrackingFilters(proNumber).ToList(); //Works
    //var trackingFilters = this._TrackingOverviewDataController.RetrieveTrackingFilters(proNumber); //Doesn't work

    RemoveDuplicateFilterData(trackingFilters); //If I don't do a ToList() then the changes that occur in this method call do not persist
    ...
}

private static void RemoveDuplicateFilterData(IEnumerable<TrackingFilter> filters)
{
    var valuePairs = new Dictionary<string, IList<object>>();

    foreach (var filter in filters)
    {
        if (valuePairs.ContainsKey("comments") && valuePairs["comments"].Contains(filter.Comments))
        {
            filter.Comments = string.Empty;
        }
        else if (!string.IsNullOrWhiteSpace(filter.Comments))
        {
            if (!valuePairs.ContainsKey("comments"))
            {
                valuePairs.Add("comments", new List<object>());
            }

            valuePairs["comments"].Add(filter.Comments);
        }    
    }

    ...
}

1 Ответ

3 голосов
/ 30 ноября 2010

Если ваш RetrieveTrackingFilters(proNumber) возвращает IQueryable, то это будет вызывать создание новых объектов каждый раз, когда вы его перечисляете: один раз в RemoveDuplicateFilterData (изменения там будут потеряны) и один раз, когда вы что-то сделаете с позже в RetrieveTrackingSummary (на этом этапе будет предоставлена ​​свежая, нетронутая копия).

Попробуйте изменить .ToList() на .AsEnumerable(). Это должно все еще работать то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...