2011-12-29 5 views
0

多くの検索の後、私はなぜこの動作を見ているのかを明確に示すものは見つかりませんでした(そして、まだまだ初心者です:)LINQ - メソッド/クラスの間で選択されたコレクションを使用する

私はパラメータ(rfp)をパラメータとするメソッド(RefreshFilter)を持っています。 rfpにはListというタイプの 'Items'という名前のプロパティがあります。

私はこのようになりRefreshFilterへの2つの呼び出しがあります。ここでは

rfp = RefreshFilter(rfp, FilteredBy.Category) 
rfp = RefreshFilter(rfp, FilteredBy.Industry) 

はRefreshFilter方法である:

public FilterParams RefreshFilterList(FilterParams rfp, FilteredBy filteredBy) 
{ 
    using (myEntity context as new myEntity()) 
    { 
     itemsInCategory = (from i in context.items 
          join ic in context.ItemsCategories on i.Id equals ic.items.id 
          where ic.Categories.Id == '52' 
          select i).ToList<items>(); 

     rfp.Items = rfp.Items.Intersect(itemsInCategory).ToList<items>(); 
    } 
    return rfp; 
} 

RefreshFilter(...)への最初の呼び出しだけで罰金とリターン作品交差したリストを含む.itemsプロパティを持つFilterParamsオブジェクト。

RefreshFilterへの2回目の呼び出し(...)常には(私が一致する要素がリストにある知っているので、期待されていない)0要素のリストを含む.itemsプロパティでFilterParamsオブジェクトを返します。 。

いくつかのテストを通して、これをrfp.Itemsが設定されているコンテキストに関連するものに絞り込むことができたと私は信じています。しかし、コンテクスト間でコレクションを共有する適切な方法は、それらをコレクションオブジェクトに選択してこれらのオブジェクトを渡しますが、これらのオブジェクトは何らかの形で初期コンテキストに関連付けられているようです。

おかげで、

答えて

0

はこれを試してみてください:

public FilterParams RefreshFilterList(FilterParams rfp, FilteredBy filteredBy) 
{ 
    using (myEntity context as new myEntity()) 
    { 
     itemIdsInCategory = (from i in context.items 
          join ic in context.ItemsCategories on i.Id equals ic.items.id 
          where ic.Categories.Id == '52' 
          select i.Id).ToList<int>(); 

     rfp.Items = rfp.Items.Where(i => itemIdsInCategory.Contains(i.Id)).ToList<Item>(); 
    } 
    return rfp; 
} 

ここでは唯一、同様のパフォーマンス上の利点を提供できるアイテムの固有のID(この場合はint)を比較しています。

+0

ありがとうございました!それは完璧に働いた(さらに意味がある)! – cre8ive

+0

これをさらにテストした後も、メソッド間でコレクションを渡す際に問題が発生します。 RefreshFilter()への2回目の呼び出しでrfpに対してLINQクエリを実行すると(context.Itemsではなく** rfp.Items **)、オブジェクト参照がインスタンスに設定されていませんオブジェクトの。 on tc.items.id。私の意図は、メソッド間でrfpオブジェクトをきれいに渡せるようにすることですが、rfp.Itemsが最初に設定されると、元のメソッドの外で(おそらくコンテキストが使用されているため)値を設定することができません。 – cre8ive

+0

RefreshFilter()への最初の呼び出しで、rfp.Itemsが次のように入力/開始されていることを明確にする必要があります:rfp.Items =(from context.items select i).ToList ()。 – cre8ive

関連する問題