2011-05-11 12 views
14

कोई भी बता सकता है कि आईडी के बजाए इकाई द्वारा क्यों शामिल हो सकता है, आईडी वास्तव में बदसूरत एसक्यूएल उत्पन्न करता है जब वास्तव में अवधारणात्मक रूप से ऐसा करता है जो आपको लगता है कि वही बात थी? जैसेआईडी से बदले में LINQ से इकाइयों में शामिल होने के कारण ग़लत एसक्यूएल

आईडी

from companyDirector in CompanyDirectors 
join contactAddress in ContactAddresses 
    on companyDirector.ContactAddress.Id equals contactAddress.Id 
select new {companyDirector, contactAddress} 

द्वारा उत्पन्न

FROM [COMPANY] AS [Extent1] 
    INNER JOIN [ADDRESS] AS [Extent2] ON [Extent1].[CONTACT_ADDRESS_ID] = [Extent2].[CONTACT_ADDRESS_ID] 

उदाहरण द्वारा

from companyDirector in CompanyDirectors 
join contactAddress in ContactAddresses 
    on companyDirector.ContactAddress equals contactAddress 
select new {companyDirector, contactAddress} 

उत्पन्न

FROM [COMPANY] AS [Extent1] 
INNER JOIN [ADDRESS] AS [Extent2] ON EXISTS (SELECT 
    1 AS [C1] 
    FROM (SELECT 1 AS X) AS [SingleRowTable1] 
    LEFT OUTER JOIN (SELECT 
     [Extent3].[CONTACT_ADDRESS_ID] AS [CONTACT_ADDRESS_ID] 
     FROM [ADDRESS] AS [Extent3] 
     WHERE [Extent1].[CONTACT_ADDRESS_ID] = [Extent3].[CONTACT_ADDRESS_ID]) AS [Project1] ON 1 = 1 
    LEFT OUTER JOIN (SELECT 
     [Extent4].[CONTACT_ADDRESS_ID] AS [CONTACT_ADDRESS_ID] 
     FROM [ADDRESS] AS [Extent4] 
     WHERE [Extent1].[CONTACT_ADDRESS_ID] = [Extent4].[CONTACT_ADDRESS_ID]) AS [Project2] ON 1 = 1 
    WHERE [Project1].[CONTACT_ADDRESS_ID] = [Extent2].[CONTACT_ADDRESS_ID] 
) 

यह मेरे लिए बहुत अक्षम है, जो आपको आईडी रूट में मजबूर करता है। बाएं क्यों दो बार जुड़ रहे हैं, कभी एक बार ध्यान नहीं ??

+1

यहां तक ​​कि यह सवाल बहुत अच्छा है, हम शायद ही इसका उत्तर यहां दे सकते हैं। एडीओ.NET टीम के लिए यही सवाल है। –

+0

यदि ADO.NET टीम इन खोजशब्दों की सदस्यता नहीं लेती है तो उन्हें किसी के क्रॉसहेयर में होना चाहिए :) –

+2

FWIW, मैं या तो एक नहीं लिखूंगा। मैं कंपनी डायरेक्टर में कंपनी डायरेक्टर से कंपनी डायरेक्टर से कंपनी डायरेक्टर में संपर्क करूँगा। संपर्क एड्रेस्रेस नए {companyDirector, contactAddress} 'का चयन करें, जो सही तरीके से काम करना चाहिए और लिखने के लिए डीबी स्कीमा के ज्ञान की आवश्यकता नहीं है। –

उत्तर

0

अंत में, मेरे लिए ईएफ में अभी भी बड़ी व्यापक दुनिया में प्रदर्शन करने के लिए आवश्यक परिपक्वता और सुविधाओं की कमी है। इसलिए मैंने इसे एनएचबर्ननेट के पक्ष में छोड़ दिया जो आसानी से सुंदर और अनुकूलित एसक्यूएल उत्पन्न करता है।

1

मैं नहीं कह सकता कि दिमाग में क्या है या ADO.NET टीम का कोड क्या है। यही कारण है कि कहा, मैं दो संभावित मुद्दों देखें:

  1. संभवतः, ContractAddresses में अंतर्निहित तालिका में Id क्षेत्र, या संभवतः सिर्फ इकाई मॉडल में, एक प्राथमिक कुंजी के रूप में परिभाषित नहीं किया जा सका। मुझे कुछ हद तक संदेह है कि यह समस्या है, लेकिन यह दोहरी जांच के लायक है।
  2. equals कीवर्ड में शामिल होने में दो वस्तुओं के बीच समानता की तुलना करने के लिए वास्तव में एक अच्छा तरीका नहीं हो सकता है। एक त्वरित वेब खोज में, मैं बिल्कुल क्या equals तुलना के लिए उपयोग करता है भी नहीं मिला है, लेकिन this MSDN how-to मुझे ओर जाता है (भले ही समग्र कुंजी शामिल नहीं है) विश्वास है कि Equals और GetHashCode तरीकों शामिल हैं। यदि आप केवल डिफ़ॉल्ट object.Equals विरासत विधि का उपयोग कर रहे हैं, तो लिंक प्रदाता को संदर्भ समानता को किसी भी तरह से समझना होगा, जिसे मैं कल्पना करता हूं कि कुछ अजीब परिणाम हो सकते हैं।

मुझे उनकी टिप्पणी में @ क्रैग स्टंटज़ द्वारा समाधान पसंद है। साथ ही, आप यह देखने के लिए लंबी क्वेरी के लिए निष्पादन योजना प्राप्त करना चाहेंगे कि यह वास्तव में खराब है जैसा दिखता है; कोड ऑप्टिमाइज़र कोड की तुलना में बेहतर काम कर सकता है।

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