2011-04-14 8 views
7

जब मेरे पास मेरे चयन में उसी तालिका का संदर्भ होता है, जहां मेरे क्लॉज में, लिनक से निबर्ननेट दो जुड़ता है, एक चयन के लिए और एक कहां के लिए। अर्थातलिंक से एनएचबर्ननेट एक ही तालिका में एकाधिक जोड़ों को उत्पन्न करता है

from child in Session.Query<Child>() 
where child.Parent.Name == "Bob" 
select new Info 
{ 
    ParentAge = child.Parent.Age, 
    ChildName = child.Name 
}; 

उत्पन्न करता है की तरह एसक्यूएल:

Select this_.Name, 
     parent1.Age 
From Child this_ 
    left join Parent parent1 on child.ParentId = parent1.Id, 
Parent parent2 

Where child.ParentId = parent2.Id and parent2.Name = 'Bob' 

मैं सोचा होगा मैं एसक्यूएल अधिक की तरह मिलना चाहिए:

Select this_.Name, 
     parent1.Age 
From Child this_ 
     inner join Parent parent1 on child.ParentId = parent1.Id 
Where parent1.Name = 'Bob' 

इस पाने के लिए क्वेरी की संरचना करने के लिए एक रास्ता है? क्या इससे कोई फर्क पड़ता है?

+0

आप अपनी मैपिंग फ़ाइल कैसे सेट किया? क्या आपने झूठ के लिए कैस्केड विकल्प सेट किया है? – cpoDesign

उत्तर

1

क्या आपने एसएसएमएस में प्रत्येक के लिए क्वेरी निष्पादन योजना की तुलना करने की कोशिश की है? यदि डुप्लिकेट शामिल SQL सर्वर में समाप्त हो गया है, तो इससे कोई फर्क नहीं पड़ता। मैंने पाया है कि कुछ मामलों में मामला होना जहां मैंने सोचा था कि जेनरेट की गई क्वेरी बहुत अक्षम होगी, लेकिन अनुकूलन के बाद यह एक प्रश्न के समान ही समाप्त होता है कि बहुत बेहतर दिखता है।

+0

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

4

आप एक पारदर्शी पहचानकर्ता का उपयोग करके ऐसा करने से रोका जा सकता है NHibernate ताकि आपकी क्वेरी इस तरह दिखता है:

from child in Session.Query<Child>() 
let p = child.Parent 
where p.Name == "Bob" 
select new Info { 
    ParentAge = p.Age, 
    ChildName = child.Name 
}; 
संबंधित मुद्दे