2011-10-20 7 views
0

ストアドプロシージャが遅いので、私はいくつかのストアドプロシージャをvb.net linq(SQLからlinq ....に手動)にしています。linqはスレッドをブロックしますか?

私は同時スレッドでlinqクエリを使用しています。

パフォーマンス分析を実行した後、私はlinqがクエリ時にソースコレクション(cache.IPMS_TBL_EL_PRICE_COMPONENTのようなコード期間)をロックするように見えます。

本当ですか? linqの(not_lock/lock)オプションはありますか? 私は本当にコレクションをロックしたくありません。マルチスレッドクエリが遅くなります。

ありがとうございました。

コード期間:

http://imgur.com/Z9vsRで参照するか、あなたは、クエリが熱心に(そこに、次に)を評価する原因となるToListを呼び出している

insert0 = (From PPC In cache.IPMS_TBL_EL_PRODUCT_PRICE_COMPONENT_MAPPING 
          From PC In cache.IPMS_TBL_EL_PRICE_COMPONENT 
          Join LK In cache.IPMS_TBL_LOOKUP 
          On PC.Component_Type_Id Equals LK.Lookup_Id 
          Where (PC.Component_Id = PPC.Component_Id OrElse PC.Component_Type_Id = CC3_ID) _ 
          AndAlso LK.Commodity_Id = ELE_COMMODITY_ID _ 
          AndAlso LK.Lookup_Type.ToLower = PRICE_COMPONENT_TYPE.ToLower _ 
          AndAlso PPC.Product_Id = IN_PRODUCT_ID _ 
          AndAlso PPC.Price_Type_Id = IN_PRICE_TYPE_ID _ 
          AndAlso PC.Is_Deleted = 0 _ 
          AndAlso LK.Lookup_Id > MINUS_HUNDRED _ 
          AndAlso PC.Component_Id > MINUS_HUNDRED _ 
          AndAlso lookupValues.Contains(LK.Lookup_Value.ToLower) _ 
          AndAlso (Not PC.ISO_Id.HasValue OrElse Not deletedISO.Contains(PC.ISO_Id.Value)) 
          Select New PriceComponents() With {.ComponentID = PC.Component_Id, 
                   .ComponentName = PC.Component_Name, 
                   .ComponentTypeID = PC.Component_Type_Id, 
                   .ComponentTypeName = LK.Lookup_Value, 
                   .Sequence = PC.Sequence, 
                   .OrderSequence = orderSequeceDict(LK.Lookup_Value.ToLower), 
                   .IsMTM = PC.Is_MTM, 
                   .UcapUsageFactorUnitPrice = PC.UCAP_Usage_Factor_UnitPrice, 
                   .Percentage = PERCENTAGE} 
          ).OrderBy(Function(e As PriceComponents) e.OrderSequence).ThenBy(Function(e As PriceComponents) e.Sequence) _ 
          .Distinct(New PriceComponentsComparer_PK_9_Fields).ToList 
+0

'cache'がLINQ to SQLデータコンテキストの場合、スレッド間で共有されるべきではありません。 –

+0

ここでちょっとバックアップしましょう...なぜストアドプロシージャが遅いのか分かりましたか?それはL2Sに変換する珍しい理由です。 LINQクエリがストアドプロシージャを実行しますか? –

+0

問合せ中にブロック(非遅延、同期実行)またはロックされたもの(マルチスレッド使用の防止)に関する質問はありますか?これらは非常に異なるものです。 –

答えて

3

下記を参照してください。

ToListで、要求された結果を返す結果セットを反復処理します。これは実際に現在のスレッドを使用します。

評価を延期することはできません。ToListと呼び出さず、実際に結果を反復処理する必要がある場合のみ評価します。

+0

合理的に聞こえる。私はこのアプローチをテストするための簡単なプロジェクトを立ち上げます。もう一時間お待ちください。ありがとうございました。 – orange

関連する問題