2010-11-01 7 views
18

मैं वास्तव में इस तरह कुछ करना चाहता हूँ:कैसे LINQ की इकाइयां करने के लिए एक एसक्यूएल "कहाँ मौजूद है" करना है?

Select * 
from A join B on A.key = B.key join C on B.key = C.key -- propagated keys 
where exists (select null from B where A.key = B.key and B.Name = "Joe") and 
     exists (select null from C where B.key = C.key and C.Name = "Kim") 

LINQ कथन का उपयोग इकाई की रूपरेखा 4 और सी # कैसे दिखते हैं?

अद्यतन:

जाहिर .Contains() का उत्पादन करेगा परिणाम "कहाँ मौजूद है"। तो, एक और प्रयास
(मैं अगर यह भी LOL संकलन होगा पता नहीं है):

var inner1 = from recordB in B 
      where recordB.Name = "Joe" 
      select recordB.key; 

var inner2 = from recordC in C 
      where recordC.Name = "Kim" 
      select recordC.key; 

var result = from recordA in A 
      where inner1.Contains(recordA.key) && 
        inner2.Contains(recordA.key) 
      select recordA; 

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

:

var result = from A in Products 
      where A.kfield1 == 1 && A.kfield2 == 2 && 
        (from B in Btable 
        where B.otherid == "Joe" && // field I want to select by 
          B.kfield1 == A.kfield1 &&  
          B.kfield2 == A.kfield2 // Can keep adding keys here 
        select A.identifier // unique identity field 
        ).Contains(A.identifier) && 
        (from C in Ctable 
        where C.otherid == "Kim" && // field I want to select by 
          C.kfield1 == A.kfield1 &&  
          C.kfield2 == A.kfield2 // Can keep adding keys here 
        select A.identifier // unique identity field 
        ).Contains(A.identifier) 
      select A; 

यह इस एसक्यूएल उत्पादित: वाह यह है कि क्या वास्तव में काम किया है

SELECT [t0].[identifier], [t0].* 
FROM [A] AS [t0] 
WHERE ([t0].[kfield1] = @p0) AND ([t0].[kfield2] = @p1) AND (EXISTS(
    SELECT NULL AS [EMPTY] 
    FROM [B] AS [t1] 
    WHERE ([t0].[identifier] = [t0].[identifier]) AND ([t1].[otherid] = @p2) AND 
      ([t1].[kfield1] = [t0].[kfield1]) AND 
      ([t1].[kfield2] = [t0].[kfield2]))) AND (EXISTS(
    SELECT NULL AS [EMPTY] 
    FROM [C] AS [t2] 
    WHERE ([t0].[identifier] = [t0].[identifier]) AND ([t2].[otherid] = @p3) AND 
      ([t2].[kfield1] = [t0].[kfield1]) AND 
      ([t2].[kfiekd2] = [t0].[kfield2]))) 

कौन सा मैं चाहता था है। सूचना [t0]। [पहचानकर्ता] = [t0]। [पहचानकर्ता], जो शून्य मान को फ़िल्टर कर देता है क्योंकि अशक्त ही (एसक्यूएल में) सहित कुछ भी करने के लिए बराबर की तुलना नहीं करता

उत्तर

26

.Any() विस्तार प्रक्रिया आम तौर पर exists को मैप करता है।

+0

यह जानना बहुत अच्छी बात है। अब तक इंटरनेट पर मिली एकमात्र चीज एसओ उत्तरों के बाहर है।()। मैंने देखा है। कुछ() इस्तेमाल किया लेकिन मैंने दो और दो एक साथ नहीं रखा। –

+0

यह प्रश्न मुझे ऐसा करने के लिए कोड दिखा रहा है: http://stackoverflow.com/questions/4084102/how-would-i-improve-this-7-line-linq-query-that-acts-as-a- विनिर्देश –

0

आप करने के लिए अपने exists कंडीशनिंग जोड़ने की कोशिश की है आपका जुड़ता है?

from a in context.AEntity 
Join B in context.BEntity on A.Key equals B.Key && B.Name == "Joe" 
Join C in context.CEntity on B.Key equals C.Key && C.Name == "Kim"; 

सुनिश्चित नहीं है कि यह काम करेगा, लेकिन एक शॉट के लायक है।

+0

नहीं, यह काम नहीं करेगा। 'On' खंड केवल फिर से एक' equals' अभिव्यक्ति –

+0

अपने प्रश्न को देखते हुए स्वीकार करता है, मुझे यकीन है कि मैं समझता हूँ कि तुम क्यों 'exists' पहली जगह में उपयोग कर रहे हैं नहीं कर रहा हूँ। क्यों न केवल 'N.Name == "जो" && C.Name == "किम" 'जोड़ें? –

+0

क्योंकि मैं कोई मौजूदा क्वेरी है कि परिणाम नेस्ट है फिल्टर करने के लिए कोशिश कर रहा हूँ। मुझे घोंसला वाले हिस्से से फ़िल्टर करना होगा। ऐसा करने का एकमात्र तरीका यह है कि जहां मौजूद है, इसका उपयोग करके (यदि यह सत्य है, तो रिकॉर्ड प्राप्त करें)। –

संबंधित मुद्दे