2

我有一个相当简单的 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 - 但没有返回任何内容。我已经在类上尝试了实现 IRequiresSessionState(这有助于通用 http 处理程序 [.ashx] 中的类似情况) - 没有运气。

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

我能做些什么?

我正在使用:Web 开发、.Net 4、VB.net


一步一步:
page_load (in .aspx)
dim objSearch as new SearchClass()
dim output = objSearch.renderProductsFound()

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

dim x = 从 lstProductList.AsParallel 中的产品
按 Product.Price.GrossPrice 降序选择产品

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

在 Product.Price.NetPrice 中获取:
return NetBasePrice*Session("exchange_rate")

再次,简化代码,这里粘贴太多了。如果我将查询解包到 For 循环中,则工作正常。

4

2 回答 2

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强制评估查询(否则它可能会在稍后的某个时间延迟执行),但我认为我上面描述的更改应该可以解决它。

于 2010-03-16T22:30:16.030 回答
0

您应该真正将值从会话状态中读取到您知道在 LINQ 语句中需要的局部变量中。否则,当值基本恒定时,您实际上每次都在为每个线程中的每个元素访问 NameValueCollection 实例。

于 2010-03-22T14:39:48.710 回答