在pLinq查询中使用会话状态

时间:2010-03-16 14:27:10

标签: linq httpcontext plinq

我有一个相当简单的Linq查询(简化代码):

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

产品是一个类。 Product.Price是一个子类,GrossPrice是它的一个属性。为了计算我需要使用Session(“exchange_rate”)的价格。

因此,对于lstProductList中的每个项目,都有一个执行以下操作的函数:

NetPrice=NetPrice * Session("exchange_rate")

(然后GrossPrice返回NetPrice + VatAmount)

无论我尝试过什么,我都无法访问会话状态。

我已经尝试过HttpContext.Current - 但是返回Nothing。 我已经在类上尝试了Implements IRequiresSessionState(这在通用的http处理程序[.ashx]中有类似的情况) - 没有运气。

我正在使用简单的InProc会话状态模式。汇率必须是用户特定的。

我该怎么办?

我正在与: 网站开发,.Net 4,VB.net


步骤一步:
page_load(in .aspx)
dim obj搜索新的SearchClass()
dim output = objSearch.renderProductsFound()

然后在objSearch.renderProductsFound中:
lstProductList.Add(objProduct(1))
...
lstProductList.Add(objProduct(n))的

dim x =来自lstProductList.AsParallel中的产品         按Product.Price.GrossPrice Descending排序选择产品

在Product.Price.GrossPrice获取:
返回me.NetPrice + me.VatAmount

在Product.Price.NetPrice获取:
返回NetBasePrice * Session(“exchange_rate”)


同样,简化的代码,太多了,无法粘贴在这里。如果我将查询解包为For循环,则工作正常。

2 个答案:

答案 0 :(得分:0)

我不确定HttpContext.Current是如何工作的,但如果它只能在处理HTTP请求的主线程上工作,我也不会感到惊讶。这意味着您不能在任何其他线程上使用它。当PLINQ执行查询时,它会从线程池中选择一些随机线程,并使用这些线程评估查询中的谓词,因此这可能是您的查询不起作用的原因。

如果GrossPrice属性只需要访问会话状态中的一个东西,那么将它更改为方法并将会话状态中的值作为参数传递应该相当容易:

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

根据您以后使用x的位置,您还可以添加对ToList的调用以强制对查询进行评估(否则可能会在稍后的某个时间执行),但我认为我上面描述的改变应该解决它。

答案 1 :(得分:0)

您应该真正读取会话状态之外的值以及LINQ语句中您需要的本地变量。否则,当值基本上保持不变时,您实际上每次都会为每个单个线程中的每个元素访问NameValueCollection实例。