2

私はかなり単純なLinqクエリ(簡略化されたコード)を持っています:

dim x = From Product In lstProductList.AsParallel 
        Order By Product.Price.GrossPrice Descending Select Product

製品はクラスです。Product.Price は子クラスで、GrossPrice はそのプロパティの 1 つです。価格を計算するには、Session("exchange_rate") を使用する必要があります。

したがって、lstProductList の各アイテムには、次のことを行う関数があります。

NetPrice=NetPrice * Session("exchange_rate")

(そして GrossPrice は NetPrice+VatAmount を返します)

何を試しても、セッション状態にアクセスできません。

HttpContext.Current を試しましたが、何も返されません。クラスでIRequiresSessionStateの実装を試しました(これは、一般的なhttpハンドラー[.ashx]で同様の状況に役立ちます)-運が悪いです。

シンプルな InProc セッション状態モードを使用しています。為替レートはユーザー固有のものでなければなりません。

私に何ができる?

私が働いている: Web 開発、.Net 4、VB.net


ステップバイステップ:
page_load (.aspx 内)
dim objSearch as new SearchClass()
dim output = objSearch.renderProductsFound()

その後、objSearch.renderProductsFound:
lstProductList.Add(objProduct(1))
...
lstProductList.Add(objProduct(n))

dim x = From Product In lstProductList.AsParallel
Order By Product.Price.GrossPrice 降順 製品を選択

In Product.Price.GrossPrice Get :
return me.NetPrice+me.VatAmount

Product.Price.NetPrice Get:
return NetBasePrice*Session("exchange_rate")

繰り返しますが、単純化されたコードで、ここに貼り付けるには多すぎます。クエリを For ループにアンラップすると、正常に動作します。

4

2 に答える 2

0

実際には、セッション状態から、LINQ ステートメント内で必要であることがわかっているローカル変数に値を読み取る必要があります。それ以外の場合、値が本質的に一定である場合、実際には、すべての単一スレッドのすべての単一要素に対して毎回 NameValueCollection インスタンスにアクセスしています。

于 2010-03-22T14:39:48.710 に答える
0

どのように機能するかは正確にはわかりHttpContext.Currentませんが、HTTP 要求を処理しているメイン スレッドでのみ機能する場合でも驚かないでしょう。これは、他のスレッドでは使用できないことを意味します。PLINQ がクエリを実行するとき、スレッド プールからいくつかのランダム スレッドを選択し、これらのスレッドを使用してクエリの述語を評価するため、これがクエリが機能しない理由である可能性があります。

GrossPriceプロパティがセッション状態から 1 つのものだけにアクセスする必要がある場合は、それをメソッドに変更して、セッション状態からの値を引数として渡すのはかなり簡単です。

Dim rate = Session("exchange_rate")
Dim x = From product In lstProductList.AsParallel  
        Order By product.Price.GetGrossPrice(rate) Descending 
        Select product 

後で使用する場所に応じて、クエリの評価を強制する へxの呼び出しを追加することもできToListます (そうしないと、後で遅延実行される可能性があります)。

于 2010-03-16T22:30:16.030 に答える