2012-02-29 10 views
13
यहाँ

किसी SQL क्वेरी मैं EF4.3परिवर्तित एक वाम बाहरी इकाई की रूपरेखा के लिए शामिल हों

 command = database.GetSqlStringCommand(@" 
           select 
            H.AUTHENTICATION_ID, 
            USERNAME, 
            PERMISSIONS, 
            ORGANIZATION_IDENTIFIER, 
            O.ORGANIZATION_ID 
           from 
            AUTHENTICATION H 
             left join [AUTHORIZATION] T on H.AUTHENTICATION_ID=T.AUTHENTICATION_ID 
             join ORGANIZATION O on O.ORGANIZATION_ID = T.ORGANIZATION_ID 
           order by H.AUTHENTICATION_ID"); 

यहाँ करने के लिए परिवर्तित करना चाहते है सबसे अच्छा LINQ मैं के साथ आ सकता है:

 var query = from h in context.Authentications 
      join t in context.Authorizations on h.AuthenticationId equals t.Authentications.AuthenticationId 
      join o in context.Organizations on t.Organizations.OrganizationId equals o.OrganizationId 
      orderby 
      h.AuthenticationId 
      select new 
      { AUTHENTICATION_ID = (Int16?)h.AuthenticationId, 
       h.Username, 
       t.Permissions, 
       o.OrganizationIdentifier, 
       OrganizationID = (Int16?)o.OrganizationId 
      }; 

मैं मुझे पता है कि मुझे अपना पहला जुड़ना (प्राधिकरण & प्रमाणीकरण के बीच) में विलय करने की आवश्यकता है, चलिए x कहें और डिफ़ॉल्ट IFEmpty लागू करें लेकिन वाक्यविन्यास नहीं बना सकते हैं।

संपादित करें: स्पष्टीकरण के लिए छवि: Data Model

किसी भी मदद अत्यधिक सराहना की जाएगी। सादर।

उत्तर

33

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

from x in table1 
join y in table2 on x.id equals y.id into jointable 
from z in jointable.DefaultIfEmpty() 
select new 
{ 
    x.Field1, 
    x.Field2, 
    x.Field3, 
    Field4 = z == null ? 0 : z.Field4 
}; 

आपके मामले में, मैं एक छोटे से उलझन में है क्योंकि इकाई संबंधों आप अपने Linq डॉन में ज़रिये जुड़े हुए हैं हूँ ' आपके एसक्यूएल द्वारा निहित लोगों से मेल नहीं खाता; यहां संबंध शून्य-या-एक, शून्य-या-कई, एक-से-एक आदि हैं? विशेष रूप से, आप इस कार्य कर रहे हैं:

from h in context.Authentications 
join t in context.Authorizations on h.AuthenticationId equals t.Authentications.AuthenticationId 

लेकिन अपने एसक्यूएल का तात्पर्य है कि "प्रमाणीकरण" शून्य या अधिक "प्राधिकरण" बच्चों, नहीं दूसरी तरह के आसपास, जो और अधिक की तरह होगा के साथ यहाँ माता पिता है:

from h in context.Authentications 
from t in h.Authorizations.DefaultIfEmpty() 

आप हमें डेटा मॉडल का एक बेहतर विचार दे सकते हैं और कौन-सा डेटा आप इसे से बाहर निकलना हम और अधिक आसानी से कैसे उस क्वेरी Linq में लगेगा व्याख्या कर सकते हैं उम्मीद है। यह मानते हुए कि अपने संबंधों से मेल खाती क्या एसक्यूएल द्वारा निहित है, तुम क्या आप निम्नलिखित LINQ क्वेरी का उपयोग कर करना चाहते हैं प्राप्त करने में सक्षम होना चाहिए:

var query = from h in context.Authentications 
      from t in h.Authorizations.DefaultIfEmpty() 
      select new 
      { 
       h.AuthenticationId, 
       h.Username, 
       Permissions = t == null ? null : t.Permissions, 
       Organizations = t == null ? new EntitySet<Organization>() : t.Organizations 
      }; 

var query2 = from x in query 
      from o in x.organizations.DefaultIfEmpty() 
      select new 
      { 
       AUTHENTICATION_ID = (short?)x.AuthenticationId, 
       x.Username, 
       x.Permissions, 
       OrganizationIdentifier = o == null ? null : o.OrganizationIdentifier, 
       OrganizationID = o == null ? (short?)null : o.OrganizationID 
      }; 
+0

विवरण के लिए धन्यवाद। मैंने अपने प्रश्न में एक छवि संलग्न की है। कृपया देखें कि क्या यह मेरी स्थिति को स्पष्ट करता है। जवाब के लिए धन्यवाद। बहुत सराहना की। – DoomerDGR8

+1

छवि को देखते हुए मुझे लगता है कि मैंने पोस्ट किया गया LINQ काम करेगा। यह आपको प्रमाणीकरण तालिका से सबकुछ देगा, साथ ही इस प्रमाणीकरण के लिए किसी मिलान करने वाले प्राधिकरण (यदि कोई है), साथ ही उन प्रमाणीकरणों के लिए किसी भी मिलान संगठन। –

+1

आपको एक मामूली अपडेट की आवश्यकता हो सकती है: जैसा कि लिखा गया है, मेरा उत्तर उन प्राधिकरणों को वापस कर देगा जिनके पास कोई भी संगठन रिकॉर्ड नहीं है - एक आंतरिक जुड़ने के बजाय दूसरा बाएं-जॉइन। आपके डेटा मॉडल के आधार पर जो संभवतः हो सकता है या नहीं हो सकता है, आपको चिंता करने की आवश्यकता है; अगर यह एक चिंता है तो मुझे बताएं। –

-3

मैं आगे चला गया और डेटाबेस पर एक संग्रहीत प्रक्रिया को पूरा क्वेरी ले जाया गया। यह LINQ और ऑब्जेक्टबिल्डर से पहले स्थान पर टालने से समस्या हल करता है।

+3

स्पष्ट सबसे खराब मामला फॉलबैक, उपयोगी उत्तर नहीं। –

+0

मेरे लिए यह नौकरी के लिए सही उपकरण का उपयोग करने का एक स्पष्ट मामला है। – Vaiden

+2

जब आप एक हथौड़ा धारण कर रहे होते हैं तो लगता है कि आप जो कुछ भी देखते हैं वह एक नाखून जैसा दिखता है। –

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