سؤال

لدي استعلام 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 - ولكن هذا لا يُرجع شيئًا.لقد جربت Implements IRequiresSessionState في الفصل الدراسي (مما يساعد في موقف مماثل في معالجات http العامة [.ashx]) - ولم يحالفني الحظ.

أنا أستخدم وضع حالة جلسة InProc البسيط.يجب أن يكون سعر الصرف محددًا للمستخدم.

ماذا يمكنني أن أفعل؟

أنا أعمل مع:تطوير الويب، .نت 4، VB.net


خطوة بخطوة:
page_load (بتنسيق aspx.)
خافت objSearch كـ SearchClass جديد ()
الإخراج الخافت = objSearch.renderProductsFound ()

ثم في objSearch.renderProductsFound:
lstProductList.Add(objProduct(1))
...
lstProductList.Add(objProduct(n))

dim x = من المنتج الموجود في lstProductList.AsParallel
اطلب حسب المنتج.السعر.السعر الإجمالي تنازليًا حدد المنتج

في المنتج.السعر.السعر الإجمالي احصل على:
إرجاع لي.NetPrice+me.VatAmount

في المنتج.السعر.السعر الصافي احصل على:
إرجاع NetBasePrice*Session("exchange_rate")

مرة أخرى، كود مبسط، كثير جدًا بحيث لا يمكن لصقه هنا.يعمل بشكل جيد إذا قمت بفك الاستعلام في حلقات For.

هل كانت مفيدة؟

المحلول

لست متأكدا بالضبط كيف 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 لفرض تقييم الاستعلام (وإلا فقد يتم تنفيذه بتكاسل في وقت لاحق)، ولكن أعتقد أن التغيير الذي وصفته أعلاه يجب أن يصلحه.

نصائح أخرى

يجب عليك حقًا قراءة القيم خارج حالة الجلسة وإلى المتغيرات المحلية التي تعرف أنك بحاجة إليها ضمن بيان LINQ.وإلا فإنك في الواقع تصل إلى مثيل NameValueCollection في كل مرة لكل عنصر في كل مؤشر ترابط عندما تكون القيمة ثابتة بشكل أساسي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top