2011-07-22 13 views
2

の中に設定し得ていない、私は次の文がありますオブジェクトのプロパティは、これは私がいる奇妙な問題であり、C#

IEnumerable<CategoryListViewModel> categoryViewModels = categoryRepository.GetAllCategoryViewModels(); 

これは正しく正確に一つの要素に移入されます。

categoryViewModels.Where(cvm => cvm.CategoryId == localId).Single().Selected = true; 

まだ更新されず、選択は偽のままです。私が抜け出すと、CategoryIdとlocalIdが等しいことを確認できます。

var something = categoryViewModels.Where(cvm => cvm.CategoryId == localId).Single() 

正しく1つのviewModelを返します。実際、私が入ると、ローカル変数 "something"をSelected = falseに設定します。ローカル変数を正しく更新します。

明らかなものがありませんか?

編集:

public class CategoryListViewModel 
{ 
    public Guid CategoryId { get; set; } 

    public string CategoryName { get; set; } 

    public bool Selected { get; set; } 
} 
+0

CategoryViewModelの定義を見ることはできますか? –

+1

申し訳ありませんが、上のコードではCategoryViewModelが記述されていますが、あなたの例ではCategoryListViewModel ... typoと書かれていますか? –

+0

CategoryViewModelが値型の場合、これは問題となる可能性があります。 – Tigran

答えて

2

categoryViewModelsは実際にはIQueryableなのではないかと思いますが、それを列挙するとデータベース呼び出しを呼び出し、データベースからリストを選択します。

これは、リストを作成し、そのリスト内の1つのアイテムに対してselectedを変更することを意味します。

ただし、次回にcategoryViewModelsを列挙すると、別のSELECTが発生し、新しいリストがメモリにフェッチされます。この問題を解決するには

、あなたはToList()を試みることができる:

IEnumerable<CategoryViewModel> categoryViewModels = categoryRepository.GetAllCategoryViewModels().ToList(); 

またはあなただけの1基になるクエリが実行されていることを確認するために、いくつかの他の方法でコードを再編成することができます。

+2

これは興味深い点です!私は額面でIEnumerableを取っていた。 –

+0

これは問題だと思います...私は質問を読んで、「あなたは本当ですか?」と投稿しようとしていました。私は 'categoryRepository'という名前に気付きました:) – Stuart

0

これが奇数である、私は次のコードのビットを持っており、それが私の作品:

public static void Main() 
{ 
    var guid = Guid.NewGuid(); 
    List<CategoryListViewModel> list = new List<CategoryListViewModel> 
             { 
              new CategoryListViewModel 
               { CategoryId = guid, CategoryName = "Hi", Selected = false } 
             }; 

    list.Where(cvm => cvm.CategoryId == guid).Single().Selected = true; 

    Console.WriteLine(list[0].Selected); 
} 

public class CategoryListViewModel 
{ 
    public Guid CategoryId { get; set; } 

    public string CategoryName { get; set; } 

    public bool Selected { get; set; } 
} 

私はあなたの問題を再作成することはできません、それは私のために真を示します一度私はLINQを実行します。コード全体を投稿できますか?スニペットに表示されない副作用があるかもしれません...

関連する問題