2010-08-29 7 views
8

मैं एक समाधान है, जहां मैं आरटीएम टेम्पलेट का उपयोग कर स्वयं ट्रैकिंग संस्थाओं बनाया है। मैंने 2 परियोजनाओं के बीच इकाइयों और संदर्भ को विभाजित कर दिया है ताकि मैं टाइप परिभाषाओं का पुन: उपयोग कर सकूं क्योंकि मैं डब्ल्यूसीएफ के माध्यम से क्लाइंट/सर्वर चलाने की योजना बना रहा हूं।इकाई की रूपरेखा 4: उत्सुक लोड हो रहा है (शामिल करें) स्व ट्रैकिंग संस्थाओं का उपयोग कर फ़िल्टर के साथ

मेरी सेवा तरीकों में से एक "ProductSKU" के बच्चे वस्तुओं के साथ "उत्पाद" वस्तुओं की एक ग्राफ वापस जाने के लिए आवश्यक है और इन बारी में "productPrice" के बच्चे वस्तुओं की है। चयन मानदंड "उत्पाद" ऑब्जेक्ट की "नाम" संपत्ति, और "ProductPriceObject" की "FinancialPeriodID" संपत्ति पर होगा। अभी के लिए, मैं खोज में नाम शामिल नहीं कर रहा हूं, लेकिन मुझे ग्राफ को वापस लाने में समस्याएं आ रही हैं।

मैं बस निम्न क्वेरी निष्पादित करते हैं (ध्यान दें, इस वाक्य रचना के बजाय वास्तविक आवेदन कोड से LINQPad से लिया जाता है) ...

from product in Products.Include("Skus.PriceHistory") 
select product 

... तो मैं पूरी वस्तु ग्राफ पुनः प्राप्त करने में सक्षम हूँ जिन वस्तुओं की मुझे आवश्यकता है, उनके लिए निश्चित रूप से कोई फ़िल्टर नहीं है।

अगर इसके बजाय, मैं फिल्टर के रूप में इस परिचय ...

from product in Products.Include("Skus.PriceHistory") 
join sku in ProductSkus on product.ID equals sku.ProductID 
join price in ProductPrices on sku.ID equals price.ProductSkuID 
where price.FinancialPeriodID == 244 
select product 

... क्या मैं वापस पाने के लिए उम्मीद कर रहा हूँ "उत्पाद" वस्तुओं है, बच्चे "ProductSKU" वस्तुओं (जो कर रहे हैं "SKUs" "उत्पाद") और उनके "productPrice" वस्तुओं (जो "productSKU" के "PriceHistory" संग्रह में हैं) के संग्रह - लेकिन मैं केवल "उत्पाद" वस्तुओं वापस पाने, "SKUs" संग्रह है खाली।

मैं भी रूप में क्वेरी कोडिंग की कोशिश की है ...

from product in Products.Include("Skus.PriceHistory") 
from sku in product.Skus 
from price in sku.PriceHistory 
where price.FinancialPeriodID == 244 
select product 

... लेकिन यह कोई फर्क नहीं या तो बना देता है।

जाहिर है, मैं कुछ गलत कर किया जाना चाहिए। क्या कोई इस बात पर कोई प्रकाश डाल सकता है कि कुछ ऐसा है जो मैं कुछ घंटों के लिए सर्कल में घूम रहा हूं!

उत्तर

1

संपादित करें:

के बारे में क्या:

from product in Products.Include("Skus.PriceHistory") 
where product.Skus.Any(s => s.PriceHistory.Any(p => p.FinancialPeriodID == 244)) 
select product 

Include पहले से ही सभी आवश्यक कार्य करता है नेविगेशन गुण जहां हालत आवश्यक नहीं हैं के लिए बहुत अतिरिक्त मिलती भरने के लिए। मैन्युअल में शामिल होने या प्रक्षेपण से भी अधिक महत्वपूर्ण क्या है क्वेरी के आकार को बदल देगा और Include का उपयोग नहीं किया जाएगा।

भी सावधान रहना है कि जहां हालत फिल्टर केवल उत्पादों। यह शामिल करके लोड किए गए डेटा को फ़िल्टर नहीं करेगा - आपको कम से कम एक स्कू वाले सभी उत्पादों को वित्तीय अवधि आईडी 244 के साथ मूल्य इतिहास प्राप्त होगा, लेकिन उन उत्पादों में सभी स्कस और मूल्य इतिहास लोड होंगे। ईएफ वर्तमान में शामिल करने पर फ़िल्टरिंग का समर्थन नहीं करता है। यदि आपको फ़िल्टर किए गए संबंधों की आवश्यकता है तो आपको उन्हें प्राप्त करने के लिए अलग-अलग प्रश्न निष्पादित करना होगा।

+0

क्षमा करें, "SKUs" और "PriceHistory" दोनों संग्रह हैं, तो यह संभव नहीं है एक ही कथन में पथ के नीचे सभी तरह से नेविगेट करें। मुझे डर है कि इसमें शामिल होने के अलावा या दो उदाहरणों में दिखाए गए जोड़ों का उपयोग करने के लिए कोई विकल्प नहीं है। वैसे भी धन्यवाद। –

+0

इसने @MartinRobins की मदद नहीं की हो सकती है, लेकिन इससे मुझे अपनी परियोजना में मदद मिली! +1 यह वाक्यविन्यास मेरे लिए काम करता है (शायद मूल प्रश्न से पूरी तरह से अलग सेटअप, मुझे नहीं पता ...) – BenSwayne

1

हो सकता है कि प्रक्षेपण इस चाल कर सकते हैं?

Linq filter collection with EF

+0

धन्यवाद, लेकिन मैं वास्तव में ऑब्जेक्ट प्रकारों की संख्या को कम करना चाहता हूं जो मैं चारों ओर गुजर रहा हूं। मेरे पास पहले से ही एकदम सही "उत्पाद" प्रकार है, मैं सिर्फ उत्सुक लोडिंग को ठीक से काम करना चाहता हूं ताकि बच्चे की वस्तुएं आबादी में आ सकें। –

-1

स्व ट्रैकिंग संस्थाओं पर एक नजर डालें आलसी लोड हो रहा है प्रदर्शन करने के लिए सक्षम नहीं हैं। यही कारण है कि संग्रह डिफ़ॉल्ट इकाई पीढ़ी के साथ खाली नहीं है और एसटीई के साथ नहीं। वास्तव में यदि आप क्वेरी पर उनका उपयोग करते हैं तो आपका शामिल कभी संबंधित संस्थाओं को लोड नहीं करता है। अब आपकी एल 2 ई क्वेरी सही नहीं है।मुझे लगता है कि आप इस तरह से कुछ करना चाहता हूँ:

आशा है कि मदद करता है

माथीउ

+0

मैं आलसी लोडिंग का उपयोग करने की कोशिश नहीं कर रहा हूं; मैं उत्सुक लोडिंग का उपयोग करने की कोशिश कर रहा हूँ। अगर मैं कहां से खंड हटा देता हूं, या इसे केवल शीर्ष स्तर की वस्तु पर आधारित करता हूं, तो मुझे सभी ऑब्जेक्ट्स ठीक से मिलते हैं। यह केवल तब होता है जब मैं उस बच्चे के ऑब्जेक्ट्स के गुणों के आधार पर कहां से क्लॉज का उपयोग करता हूं जिसे "शामिल करें" को अनदेखा कर दिया जाता है। –

+0

हाय मार्टिन, क्या आपको कोई समाधान मिला है, मुझे एक ही समस्या है – freddoo

0

होने शामिल उत्सुक लोड हो रहा है के लिए कोई गारंटी नहीं है और यह निम्नलिखित की वजह से चुपचाप अनदेखा किया जा सकता है कारण। यह इस धागे में बेहतर समझाया गया है। आप मैन्युअल रूप से उस तालिका का चयन कर सकते हैं जिसे आप लोड करना चाहते हैं उदा। वस्तुओं है कि क्वेरी में सबसे बाहरी आपरेशन में पेश कर रहे हैं:

var result = from product in Products.Include("Skus.PriceHistory") 
from sku in product.Skus 
from price in sku.PriceHistory 
where price.FinancialPeriodID == 244 
select new { p=product, pricehistory = product.Skus.PriceHistory}; 
var products = results.select(pph => pph.product); 

https://social.msdn.microsoft.com/Forums/en-US/76bf1f22-7674-4e1e-85d3-68d29404e8db/include-is-ignored-in-a-subquery?forum=adodotnetentityframework

  • केवल क्वेरी परिणामों में आइटम पर लागू होता है को शामिल करें।
  • परिणामों का प्रकार एक इकाई प्रकार होना चाहिए।
  • क्वेरी आपरेशनों कि परिणाम के प्रकार में परिवर्तन नहीं हो सकते बीच शामिल करें और सबसे बाहरी आपरेशन (यानी एक GroupBy() या एक का चयन करें() आपरेशन कि परिणाम प्रकार बदलता है)
  • पैरामीटर द्वारा उठाए शामिल है नेविगेशन गुण होते हैं उस प्रकार सबसे बाहरी आपरेशन पर लौटा का एक उदाहरण से नौगम्य होना करने के लिए की एक डॉट-सीमांकित पथ
संबंधित मुद्दे