6

मुझे लिंक टू एंटिटीज में कई से अधिक रिश्ते पूछने में समस्याएं आ रही हैं। मैं मूल रूप से इस क्वेरी LINQ का उपयोग को दोहराने के लिए कोशिश कर रहा हूँ:इकाई फ्रेमवर्क - इकाइयों के लिए लिंक - कई से कई प्रश्न समस्याएं

Select * 
FROM Customer 
LEFT JOIN CustomerInterest ON Customer.CustomerID = CustomerInterest.CustomerID 
LEFT JOIN Interest ON CustomerInterest.InterestID = Interest.InterestID 
WHERE Interest.InterestName = 'Football' 

मैं नेट के आसपास देखा है और वास्तव में ऐसा करने के तरीके के किसी भी उपयुक्त उदाहरण नहीं मिला। निकटतम मैं मिल गया है है:

List<Customer> _Customers = (from _LCustomers in _CRM.Customer.Include("CustomerInterest.Interest") 
            where _LCustomers.CustomerInterest.Any(x => x.Interest.InterestName == "Football") 
            select _LCustomers).ToList(); 

इस के साथ समस्या यह एक ग्राहक एक से अधिक दिलचस्पी है कि अगर है और उनमें से एक उन सभी को लौटा दिया जाता है "फुटबॉल" तो है। मैंने ऑल() को भी देखा है जिसमें उलटी समस्या है, यानी अगर वे एक दिलचस्पी लेते हैं और यह फुटबॉल है, तो उनके पास दो और उनमें से एक फुटबॉल नहीं है, कुछ भी वापस नहीं किया जाता है।

किसी को भी कोई विचार है?

+0

कृपया इस सवाल को देखो - http://stackoverflow.com/questions/1535443 और इस पोस्ट - http://blogs.msdn.com/b/alexj/archive/2009/10/13/tip -37-कैसे करते हैं एक सशर्त-include.aspx। – Kniganapolke

उत्तर

3

मुझे यकीन नहीं है कि आप क्या प्राप्त करना चाहते हैं। ग्राहक रुचि और रुचि वाले ग्राहकों की एक सूची? बस ग्राहक ब्याज पर पूछताछ शुरू करें।

context.CustomerInterest. 
    Where(ci => ci.Interest.InterestName == "Football"). 
    Select(ci => new 
    { 
     Customer = ci.Customer, 
     CustomerInterest = ci, 
     Interest = ci.Interest 
    }); 

लेकिन यह बेहद अनावश्यक है। क्यों न सिर्फ ग्राहक के हितों को मिलते हैं?

IEnumerable<CustomerInterest> customerInterests = context.CustomerInterest. 
    Where(ci => ci.Interest.InterestName == "Football"); 

आप अभी भी यह स्पष्ट रूप से स्टोर करने के लिए जरूरत के बिना अन्य जानकारी का उपयोग कर सकते हैं।

foreach (CustomerInterest customerInterest in customerInterests) 
{ 
    DoSomething(customerInterest); 
    DoSomething(customerInterest.Customer); 
    DoSomething(customerInterest.Interest); 
} 
+0

अच्छी तरह से विचार है कि एक ग्राहक को एक ही डीबी हिट के साथ क्वेरी के आधार के रूप में ग्राहक का उपयोग करके सभी संबंधित डेटा के साथ वापस करना है। लौटाए गए डेटा को क्रमबद्ध किया जाएगा और एकल डब्ल्यूसीएफ कॉल में ग्राहक (ग्राहक रखरखाव स्क्रीन के लिए) लौटा दिया जाएगा। चूंकि हम क्लाइंट को पतला रखने और जितना संभव हो उतना सामान्य रखने की कोशिश कर रहे हैं, क्लाइंट के पास एडीएमएक्स में इकाइयों की कोई अवधारणा नहीं है, यह सिर्फ deserialized xml के साथ काम करता है और इसके साथ काम करता है। मैं गुमनाम प्रकारों से बचने और एक ग्राहक ऑब्जेक्ट को केवल संबंधित डेटा के साथ वापस करने की कोशिश कर रहा हूं जो कि खंड से मेल खाता है। –

1

यदि आप इसे सामान्य रखने की कोशिश कर रहे हैं, तो बेहतर तरीका एसक्यूएल [एस्क्यूएल] के साथ जाना है। Coz L2E linq क्वेरी में संग्रह के लिए समर्थन नहीं करता है।

आप

customer.Interests.Where (ब्याज => interest.Name == 'फुटबॉल') का उपयोग नहीं कर सकते हैं

क्वेरी इस प्रकार दिखाई देगा ..

context.CreateQuery(@"SELECT VALUE Customer FROM Customer WHERE EXISTS(SELECT VALUE FROM CustomerInterest WHERE CustomerInterest.Ineterest.Name = 'FootBall')).Include("Interest");

आशा करता हूँ की ये काम करेगा!

+0

समाधान के लिए esql पर नहीं जा रहा है बस एक हैक की तरह लग रहा है? आप अपने सभी इंटेलिजेंस खो देते हैं और केवल उन सभी चीज़ों को खो देते हैं जिन्हें ईएफ का उपयोग करने का बिंदु माना जाता था। उस बिंदु पर एक डीबीआरडर में इसे निष्पादित कर सकते हैं। –

+0

हाँ .. लेकिन आपको एडीओ में डीबीआरडर द्वारा लौटाए गए डेटा रिकॉर्ड्स की तुलना में ईएफ में एक टाइप एंटिटी ग्राहक मिलता है। –

0

यह LINQT के लिए बहुत कुछ है। दीपक एन ने कहा कि अपने डेटाबेस या काम पर एक दृश्य का उपयोग करने का प्रयास करें। बेस्ट

7

इस प्रयास करें,

var result = from c in ctx.Customer 
      from i in c.Interest 
      where i.InterestName == "Football" 
      select c; 

आशा इस मदद करता है,

रे।

2
 var results = from c in _CRM.Customer 
         from ci in c.Interests 
         join i in _CRM.Interests 
         on ci.ID equals i.ID 
         where i.Interest = "Football" 
         select c; 
संबंधित मुद्दे