2009-06-18 16 views
6

में बराबर शामिल हों मैं निम्नलिखित SQL क्वेरी के साथ काम कर रहा हूँ:शामिल हों और बायाँ LINQ

SELECT 
a.AppointmentId, 
a.Status, 
a.Type, 
a.Title, 
b.Days, 
d.Description, 
e.FormId 
FROM Appointment a (nolock) 
LEFT JOIN AppointmentFormula b (nolock) 
ON a.AppointmentId = b.AppointmentId and b.RowStatus = 1 
JOIN Type d (nolock) 
ON a.Type = d.TypeId 
LEFT JOIN AppointmentForm e (nolock) 
ON e.AppointmentId = a.AppointmentId 
WHERE a.RowStatus = 1 
AND a.Type = 1 
ORDER BY a.Type 

मैं अनिश्चित प्राप्त करने के लिए कैसे LINQ में मिलती हूँ। मेरे सभी टेबलों में विदेशी कुंजी संबंध हैं।

+1

क्या आप लिंक से एसक्यूएल का उपयोग कर रहे हैं? –

उत्तर

5

आपको कफ से बाहर निकलने के बाद इसे थोड़ा सा ट्विक करना पड़ सकता है, लेकिन कुछ प्रमुख चीजें ध्यान में रखनी हैं। यदि आपके रिश्तों को आपके डीबीएमएल में ठीक तरह से स्थापित किया गया है, तो आप आंतरिक रूप से आंतरिक रूप से जुड़ने में सक्षम होना चाहिए और केवल अपनी प्रारंभिक तालिका के माध्यम से डेटा तक पहुंच सकते हैं। साथ ही, LINQ में बाएं जुड़ने के रूप में सीधे आगे नहीं हैं क्योंकि हम उम्मीद कर सकते हैं और इसे करने के लिए आपको डिफ़ॉल्ट IfEmpty वाक्यविन्यास से गुज़रना होगा। मैंने यहां एक अनाम प्रकार बनाया है, लेकिन आप उस प्रभाव में डीटीओ कक्षा या कुछ डालना चाहते हैं। मुझे यह भी नहीं पता था कि आप नल के मामले में क्या करना चाहते थे, लेकिन आप इसका उपयोग कर सकते हैं ?? वैरिएबल देने के लिए मान को परिभाषित करने के लिए सिंटैक्स यदि मान शून्य है। मुझे पता है आप अतिरिक्त प्रश्न हैं करते हैं ...

var query = (from a in context.Appointment 
join b in context.AppointmentFormula on a.AppointmentId equals b.AppointmentId into temp 
from c in temp.DefaultIfEmpty() 
join d in context.AppointmentForm on a.AppointmentID equals e.AppointmentID into temp2 
from e in temp2.DefaultIfEmpty() 
where a.RowStatus == 1 && c.RowStatus == 1 && a.Type == 1 
select new {a.AppointmentId, a.Status, a.Type, a.Title, c.Days ?? 0, a.Type.Description, e.FormID ?? 0}).OrderBy(a.Type); 
29
SELECT A.X, B.Y 
FROM A JOIN B ON A.X = B.Y 

यह LINQ विधि कॉल (शामिल होने के लिए) उत्पन्न होगा ऊपर में शामिल हों।

var query = A.Join 
(
    B, 
    a => a.x, 
    b => b.y, 
    (a, b) => new {a.x, b.y} //if you want more columns - add them here. 
); 

SELECT A.X, B.Y 
FROM A LEFT JOIN B ON A.X = B.Y 

ये LINQ विधि कॉल (GroupJoin, SelectMany, DefaultIfEmpty करने के लिए) का उत्पादन करेगा वाम ऊपर से जुड़ें

var query = A.GroupJoin 
(
    B, 
    a => a.x, 
    b => b.y, 
    (a, g) => new {a, g} 
).SelectMany 
(
    z => z.g.DefaultIfEmpty(), 
    (z, b) => 
    new { x = z.a.x, y = b.y } //if you want more columns - add them here. 
); 

यहाँ कुंजी अवधारणा है कि Linq के तरीकों पदानुक्रम के आकार का परिणाम है , पंक्ति-स्तंभ आकार flattened नहीं।

  • Linq के GroupBy तत्वों की एक संग्रह (जो खाली नहीं छोड़ा जा सकता है) करने के लिए मिलान एक समूहीकरण कुंजी के साथ एक पदानुक्रम में आकार का परिणाम पैदा करता है। एसक्यूएल का GroupBy क्लॉज समेकित मान के साथ समूहबद्ध कुंजी उत्पन्न करता है - इसके साथ काम करने के लिए कोई उप-संग्रह नहीं है।
  • इसी तरह, लिंक का GroupJoin एक पदानुक्रमित आकार उत्पन्न करता है - एक अभिभावक रिकॉर्ड संग्रह बाल अभिलेखों (जो खाली हो सकता है) से मेल खाता है। एसक्यूएल का LEFT JOIN कोई अन्य रिकॉर्ड नहीं होने पर प्रत्येक बच्चे के रिकॉर्ड से मेल खाता एक अभिभावक रिकॉर्ड उत्पन्न करता है, या एक शून्य बच्चा रिकॉर्ड बनाता है। लिंक के आकार से एसक्यूएल के आकार को प्राप्त करने के लिए, किसी को SelectMany के साथ बाल अभिलेखों के संग्रह को अनपैक करना होगा - और DefaultIfEmpty का उपयोग करके बाल अभिलेखों के खाली संग्रह से निपटना होगा।

और यहाँ linquifying पर मेरे प्रयास है कि प्रश्न में एसक्यूएल है:

var query = 
    from a in Appointment 
    where a.RowStatus == 1 
    where a.Type == 1 
    from b in a.AppointmentFormula.Where(af => af.RowStatus == 1).DefaultIfEmpty() 
    from d in a.TypeRecord //a has a type column and is related to a table named type, disambiguate the names 
    from e in a.AppointmentForm.DefaultIfEmpty() 
    order by a.Type 
    select new { a.AppointmentId, a.Status, a.Type, a.Title, b.Days, d.Description, e.Form } 
+0

क्या आप कृपया [इस सवाल] पर एक नज़र डालें (http://stackoverflow.com/q/12496809/442580)। – capdragon

1

आप (NOLOCK) संकेत बनाए रखने के लिए चाहते हैं, मैं सी # में blogged a handy solution विस्तार तरीकों का उपयोग कर सकते है। ध्यान दें कि यह क्वेरी में प्रत्येक तालिका में नोलॉक संकेत जोड़ने जैसा ही है।

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