2010-11-30 15 views
2

IEnumerableコレクション内のオブジェクトのプロパティを変更する際に問題が発生しています。コレクション内のエンティティ間で重複した情報を削除するために、コレクションを別のメソッドに渡します。これはメソッド内で動作しますが、メソッドが実行されて呼び出し元に戻ると、変更は失われます。しかし、IEnumerableをリストに変換すると、期待どおりに動作します。私の唯一の推測は、ToListを呼び出すと具体的な型になり、それが動作することができるので、しかし、それは制限ではありません、そうですか?IEnumerable内のオブジェクトのプロパティを変更できません<T>

また、遅延実行のコンテキストではないことは何も価値がありません。あなたのRetrieveTrackingFilters(proNumber)IQueryableを返す場合、これは、その後、

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メソッドを書き換えたないことになりましたRemoveDuplicateFilterData(変更が失われる可能性があります)と、後でRetrieveTrackingSummary(後で元に戻されていないコピーがこの時点で提供されます)で後で何かを行うと、新しいオブジェクトが列挙されるたびに作成されます。

.ToList().AsEnumerable()に変更してみてください。同じように動作するはずです。

+0

私のコードペーストの最初のメソッドはRetrieveTrackingFiltersであり、IEnumerable を返します。 – joshlrogers

+0

@ joshlrogers、IQueryable はIEnumerable を実装しているため、IEnumerable内でIQueryableを「隠す」ことができます。 –

+0

@ joshlrogers、デバッガのランタイムタイプを確認してください –

関連する問題