2009-01-29 16 views
28

मेरे पास अपेक्षित रूप से लौटने वाले बाहरी बहिष्कार (नीचे) परिणाम हैं। मुझे परिणामों को 'दाएं' तालिका से 'पहले' हिट तक सीमित करने की आवश्यकता है। क्या मैं इसे किसी तरह से कर सकता हूं? वर्तमान में, मुझे दोनों तालिकाओं में प्रत्येक रिकॉर्ड के लिए परिणाम मिलते हैं, मैं केवल बाएं (आइटम) पर तालिका से एक परिणाम देखना चाहता हूं इससे कोई फर्क नहीं पड़ता कि मेरे पास सही तालिका (फ़ोटो) में कितने परिणाम हैं।LINQ बाएं बाहरी को एक पंक्ति में कैसे शामिल करें

 var query = from i in db.items 
       join p in db.photos 
       on i.id equals p.item_id into tempPhoto 
       from tp in tempPhoto.DefaultIfEmpty() 
       orderby i.date descending 
       select new 
       { 
        itemName = i.name, 
        itemID = i.id, 
        id = i.id, 
        photoID = tp.PhotoID.ToString() 
       }; 


    GridView1.DataSource = query; 
    GridView1.DataBind(); 

उत्तर

51

यह आपके लिए काम करेगा।

from i in db.items 
let p = db.photos.Where(p2 => i.id == p2.item_id).FirstOrDefault() 
orderby i.date descending 
select new 
{ 
    itemName = i.name, 
    itemID = i.id, 
    id = i.id, 
    photoID = p == null ? null : p.PhotoID.ToString(); 
} 

मैं जब मैं इसे अपने स्वयं के मॉडल के खिलाफ उत्पन्न (और नाम और दूसरा आईडी कॉलम प्रक्षेपण में बिना) इस एसक्यूएल मिला है।

SELECT [t0].[Id] AS [Id], CONVERT(NVarChar,(
    SELECT [t2].[PhotoId] 
    FROM (
     SELECT TOP (1) [t1].[PhotoId] 
     FROM [dbo].[Photos] AS [t1] 
     WHERE [t1].[Item_Id] = ([t0].[Id]) 
     ) AS [t2] 
    )) AS [PhotoId] 
FROM [dbo].[Items] AS [t0] 
ORDER BY [t0].[Id] DESC 

जब मैं योजना के लिए कहा है, यह पता चला है कि सबक्वेरी इस में शामिल होने के द्वारा किया जाता है:

<RelOp LogicalOp="Left Outer Join" PhysicalOp="Nested Loops"> 
+0

मुझे इस समाधान की लालित्य पसंद है, हालांकि मुझे लगता है कि यह एक क्वेरी बना सकता है जो उप-चयन –

+0

I के कारण एसक्यूएल अनुकूलित करने के लिए कठिन है। जांच की गई और उत्पन्न एसक्यूएल और अनुमानित निष्पादन योजना दोनों के साथ खुश था। उप-चयन को बाएं बाहरी शामिल होने की योजना बनाई गई थी। –

+1

एसक्यूएल पोस्ट करने के किसी भी मौके को शांत करें, मैं इसे देखने के लिए उत्सुक हूं। –

3

क्या आप क्या करना चाहते समूह तालिका है। यह करने के लिए सबसे अच्छा तरीका है:

var query = from i in db.items 
       join p in (from p in db.photos 
          group p by p.item_id into gp 
          where gp.Count() > 0 
          select new { item_id = g.Key, Photo = g.First() }) 
      on i.id equals p.item_id into tempPhoto 
      from tp in tempPhoto.DefaultIfEmpty() 
      orderby i.date descending 
      select new 
      { 
       itemName = i.name, 
       itemID = i.id, 
       id = i.id, 
       photoID = tp.Photo.PhotoID.ToString() 
      }; 

संपादित करें: यह डेविड B बोल है। मैं केवल यही कर रहा हूं क्योंकि निक ने मुझसे पूछा था। निक, कृपया इस अनुभाग को संशोधित या हटा दें जैसा आपको लगता है उचित है।

एसक्यूएल जेनरेट काफी बड़ा है। Int 0 (गणना के साथ तुलना करने के लिए) पैरामीटर के माध्यम से पारित किया जाता है।

SELECT [t0].X AS [id], CONVERT(NVarChar(MAX),(
    SELECT [t6].Y 
    FROM (
     SELECT TOP (1) [t5].Y 
     FROM [dbo].[Photos] AS [t5] 
     WHERE (([t4].Y IS NULL) AND ([t5].Y IS NULL)) OR (([t4].Y IS NOT NULL) AND ([t5].Y IS NOT NULL) AND ([t4].Y = [t5].Y)) 
     ) AS [t6] 
    )) AS [PhotoId] 
FROM [dbo].[Items] AS [t0] 
CROSS APPLY ((
     SELECT NULL AS [EMPTY] 
     ) AS [t1] 
    OUTER APPLY (
     SELECT [t3].Y 
     FROM (
      SELECT COUNT(*) AS [value], [t2].Y 
      FROM [dbo].[Photos] AS [t2] 
      GROUP BY [t2].Y 
      ) AS [t3] 
     WHERE (([t0].X) = [t3].Y) AND ([t3].[value] > @p0) 
     ) AS [t4]) 
ORDER BY [t0].Z DESC 

निष्पादन योजना तीन बाएं जुड़ने से पता चलता है। कम से कम एक छोटा है और इसकी गणना नहीं की जानी चाहिए (यह शून्य में लाता है)। यहां पर्याप्त जटिलता है कि मैं दक्षता के लिए किसी भी समस्या को स्पष्ट रूप से इंगित नहीं कर सकता। यह बहुत अच्छा हो सकता है।

var q = from c in 
      (from s in args 
      select s).First() 
     select c; 

क्वेरी के अंतिम भाग के चारों ओर:

+0

यह हो सकता है लिंक से एसक्यूएल का जवाब नहीं था, लेकिन इसने परिणामस्वरूप फ्रेमवर्क के लिए समस्या को हल किया, इसी तरह के परिणामस्वरूप एसक्यूएल। अब एक बेहतर समाधान की तलाश में है। –

2

आप की तरह कुछ कर सकता है। यह सुनिश्चित नहीं है कि यह काम करेगा या किस तरह का वैक एसक्यूएल उत्पन्न करेगा :)

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