2008-12-15 18 views
6
से SQL नेस्ट में करने के लिए किसी को भी

मुझे बताओ कैसे से एक्स जैसेLINQ क्वेरी

चुनें * एक नेस्टेड SQL क्वेरी लिखने के लिए कर सकते हैं जहां X.ID में (वाई से Y.XID का चयन करें जहां .....)

LINQ में

?

उत्तर

7

आप की कोशिश कर सकते:

var yIds = from y in dataContext.Y 
      where ... 
      select y.XId; 

var query = from x in dataContext.X 
      where yIds.Contains(x.Id) 
      select x; 

मैं नहीं जानता कि क्या यह हालांकि काम करेंगे - किसी भी कारण है कि तुम सिर्फ एक के बजाय शामिल होते हैं नहीं करना चाहती? उदाहरण के लिए:

var query = from x in dataContext.X 
      join y in dataContext.Y.Where(...) on x.Id equals y.Xid 
      select x; 
+2

वहाँ होना करने के लिए एक "किसी और की जरूरत है जैसा कि आप इस साइट पर स्थिति पॉपअप के रूप में बिल्कुल वही जवाब टाइप कर रहे हैं :) –

+1

शामिल होने का कारण: यदि एक्स वाई के साथ कई लोगों के लिए 1 है, तो जुड़ाव डुप्लिकेट एक्स देगा। –

+0

@ डेविड बी: सच। मुझे आश्चर्य है कि अंत में अलग() को कॉल जोड़ने से क्या होगा ... –

8

एसक्यूएल में एक आईएन करने के लिए, आपको लिंक में कंटेनस फ़ंक्शन का उपयोग करने की आवश्यकता है।

उदाहरण के लिए

तो:

var query = from x in GetX() 
      where (from y in GetY() select y.xID).Contains(x.xID) 
      select x; 

तुम भी भीतरी LINQ क्वेरी अलग से अगर आप चाहें, जो थोड़ा अधिक पठनीय

+0

प्रदर्शन के लिए इसका क्या अर्थ है? इनलाइन का उपयोग कर क्वेरी कॉन्ट्रैक्ट को परिभाषित करने में कोई अंतर आएगा? – Dimse

+0

बिल्कुल कोई फर्क नहीं पड़ता। –

5

मैं एसक्यूएल करने के लिए LINQ के लिए एक NOT IN समाधान के लिए देख रहा था है निर्धारित कर सकते हैं। इस सवाल का मैं सही बात गूगल और इस ब्लॉग पोस्ट को खोजने में सक्षम था के लिए धन्यवाद: The NOT IN clause in LINQ to SQL

#

सी
NorthwindDataContext dc = new NorthwindDataContext(); 
var query = 
    from c in dc.Customers 
    where !(from o in dc.Orders 
      select o.CustomerID) 
      .Contains(c.CustomerID) 
    select c; 

VB.net

Dim db As New NorthwinDataContext() 
Dim query = From c In dc.Customers _ 
      Where Not (From o in dc.Orders _ 
         Select o.CustomerID).Contains(c.CustomerID) _ 
      Select c 
+0

इस उत्तर ने मुझे बहुत मदद की, धन्यवाद! मेरे पास एक क्लास सेटअप है जहां एक वर्ग में एक सूची (कक्षा 2) होती है जिसमें से प्रत्येक में एक सूची (कक्षा 3) होती है (एक कंटेनर की नकल करने के लिए, वाउचर प्राप्त करने वाले सामान, और वेयरहाउस सुविधा में वाउचर लाइन प्राप्त करने वाले सामान)। प्रत्येक कक्षा के उदाहरण के माध्यम से प्रत्येक लूपिंग के बिना कक्षा 1 से शुरू करते समय कक्षा 3 में एक विशिष्ट भाग को देखने का तरीका ढूंढने की आवश्यकता है। यह बहुत अच्छा काम करता है (मेरे लिए नहीं)! – RianBattle