2010-11-30 6 views
2

IEnumerable 컬렉션의 개체 속성을 변경하는 데 문제가 있습니다. 컬렉션 내의 엔티티에서 중복 된 정보를 제거하기 위해 컬렉션을 다른 메서드로 전달합니다. 이것은 메소드 내에서 작동하지만 일단 메소드가 실행을 완료하고 호출자에게 리턴하면 변경 사항은 유실됩니다. 그러나 IEnumerable을 목록으로 변환하면 예상대로 작동합니다. 내 유일한 추측은 내가 ToList를 호출 할 때 구체적인 유형이되어 작동하도록 허용하기 때문에,하지만 제한이 있어서는 안된다는 것입니다.IEnumerable 내의 개체 속성을 수정할 수 없습니다. <T>

또한 지연된 실행의 컨텍스트에있는 것은 아닙니다.

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

    ... 
} 
+2

.ToList()는 목록에 캐스트되지 않으며, IEnumerable의 값으로 새 목록을 만드는 확장 메서드입니다. 결과는 목록에 캐스트 된 이전 구조가 아니라 이전 요소와 동일한 요소가있는 새로운 구조입니다. –

+0

@albin sunnanbo, 죄송합니다, 당신이 맞습니다, 나는 잘못된 말을 사용했습니다. 나는 그것을 실제로 알고 있었다. – joshlrogers

+0

실제로 유형이 구조체입니까? –

답변

3

경우 RetrieveTrackingFilters(proNumber) 다음이 IQueryable, 반환 이 컴파일러는이 아래로 손질 코드가 지연된 실행

을 활용하는 RetrieveTrackingFilters 방법을 다시 작성하고 진실되고 있지 결국 RemoveDuplicateFilterData (변경 사항이 손실 될 수 있음)과 나중에 RetrieveTrackingSummary (무의미한 새로운 사본이 제공 될 예정)에서 나중에 작업 할 때마다 새로운 개체가 열거 될 때마다 새 개체가 만들어집니다.

.ToList().AsEnumerable()으로 변경해보십시오. 그것은 여전히 ​​동일하게 작동해야합니다.

+0

내 코드 붙여 넣기의 첫 번째 메서드는 RetrieveTrackingFilters이며 IEnumerable 를 반환합니다. – joshlrogers

+0

@joshlrogers, IQueryable 은 IEnumerable 을 구현하므로 IQueryable은 IEnumerable 내부에 "숨겨져"있을 수 있습니다. –

+0

@joshlrogers 디버거에서 런타임 유형을 확인하십시오. –

관련 문제