Использовать состояние сеанса в запросах pLinq - PullRequest
2 голосов
/ 16 марта 2010

У меня довольно простой запрос Linq (упрощенный код):

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

Товар класса. Product.Price является дочерним классом, а GrossPrice является одним из его свойств. Для определения цены мне нужно использовать сессию ("exchange_rate").

Таким образом, для каждого элемента в lstProductList есть функция, которая выполняет следующие действия:

NetPrice=NetPrice * Session("exchange_rate")

(а затем GrossPrice возвращает NetPrice + VatAmount)

Независимо от того, что я пробовал, я не могу получить доступ к состоянию сеанса.

Я пробовал HttpContext.Current - но это ничего не возвращает. Я попытался реализует IRequiresSessionState в классе (что помогает в аналогичной ситуации в общих обработчиках http [.ashx]) - не повезло.

Я использую простой режим состояния сеанса InProc. Обменный курс должен быть привязан к пользователю.

Что я могу сделать?

Я работаю с: веб-разработка, .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 = Из продукта в lstProductList.AsParallel
Заказ по продукту. Цена. Цена по убыванию Выберите продукт

В Product.Price.GrossPrice Get:
вернуть мне. NetPrice + me.VatAmount

В Product.Price.NetPrice Get:
вернуть NetBasePrice * Session ("exchange_rate")

Опять же, упрощенный код, слишком много, чтобы вставить его сюда. Работает нормально, если развернуть запрос в циклы For.

Ответы [ 2 ]

0 голосов
/ 22 марта 2010

Вы должны действительно прочитать значения из состояния сеанса и в локальные переменные, которые вам нужны в инструкции LINQ. В противном случае вы фактически получаете доступ к экземпляру NameValueCollection каждый раз для каждого отдельного элемента в каждом отдельном потоке, когда значение по существу является постоянным.

0 голосов
/ 17 марта 2010

Я не совсем уверен, как работает 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 для принудительной оценки запроса (в противном случае он может быть выполнен лениво позднее), но я думаю, что изменение, которое я описал выше должно это исправить.

...