2010-03-30 12 views
16

लक्ष्य SQL सर्वर के सबसे कम प्रश्नों LINQ का उपयोग कर गुमनाम प्रकार का उपयोग किए बिना SQL करने के लिए जारी करने के लिए है। विधि के लिए वापसी प्रकार को IList < चाइल्डहोना आवश्यक होगा। रिश्तों इस प्रकार हैं:LINQ से SQL का उपयोग कर लोड भाई डेटा को उत्सुक कैसे करें?

  Parent 
    Child1   Child2 
Grandchild1 

जनक> Child1 एक-से-अनेक संबंध

Child1> Grandchild1 एक-से-एन संबंध (जहां n अनंत को शून्य है है)

जनक> Child2 एक-से-एन संबंध (जहां n अनंत को शून्य)

मैं एबीएल हूँ है ई माता-पिता, चाइल्ड 1 और ग्रैंडचिल्ड 1 डेटा को उत्सुक करने के लिए उत्सुक है जिसके परिणामस्वरूप SQL सर्वर पर एक क्वेरी है।

लोड विकल्पों के साथ इस क्वेरी के लिए उत्सुक लोड डेटा के सभी, भाई डेटा (Child2) को छोड़कर:

DataLoadOptions loadOptions = new DataLoadOptions(); 
loadOptions.LoadWith<Child1>(o => o.GrandChild1List); 
loadOptions.LoadWith<Child1>(o => o.Parent); 

dataContext.LoadOptions = loadOptions; 

IQueryable<Child1> children = from child in dataContext.Child1 
           select child; 

मैं भी भाई डेटा लोड करने की जरूरत है। मैंने जिस दृष्टिकोण का प्रयास किया है, वह क्वेरी को दो LINQ से SQL क्वेरीज़ में विभाजित कर रहा है और परिणाम सेट को एक साथ विलय कर रहा है (सुंदर नहीं), हालांकि भाई डेटा तक पहुंचने पर यह आलसी लोड हो जाता है।

भाई लोड विकल्प जोड़ा जा रहा है प्रत्येक Grandchild1 और Child2 रिकार्ड के लिए एसक्यूएल सर्वर के लिए एक क्वेरी जारी करेगा (जो वास्तव में क्या मैं से बचने के लिए कोशिश कर रहा हूँ):

DataLoadOptions loadOptions = new DataLoadOptions(); 
loadOptions.LoadWith<Child1>(o => o.GrandChild1List); 
loadOptions.LoadWith<Child1>(o => o.Parent); 
loadOptions.LoadWith<Parent>(o => o.Child2List); 

dataContext.LoadOptions = loadOptions; 

IQueryable<Child1> children = from child in dataContext.Child1 
           select child; 


exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0] 
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=1 

exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0] 
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=2 

exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0] 
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=3 

exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0] 
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=4 

मैं भी एसक्यूएल प्रश्नों का LINQ लिखा है सभी डेटा में शामिल होने के लिए उम्मीद है कि यह डेटा लोड करने के लिए उत्सुक होगा, हालांकि जब LINQ या SQLchild1 के LINQ से SQL EntitySet को एक्सेस किया जाता है तो यह डेटा को आलसी लोड करता है।

IList < को वापस करने का कारण Child1 > व्यावसायिक वस्तुओं को हाइड्रेट करना है।

  1. इस समस्या को गलत तरीके से निकट:

    मेरे विचार मैं या तो कर रहा हूँ कर रहे हैं।

  2. संग्रहित प्रक्रिया को कॉल करने का विकल्प है?
  3. मेरा संगठन LINQ से SQL को ORM के रूप में उपयोग नहीं करना चाहिए?

किसी भी मदद की बहुत सराहना कर रहा है।

धन्यवाद,

स्कॉट

+0

ब्याज से बाहर, क्यों नहीं आप गुमनाम प्रकार या कंटेनर के कुछ प्रकार का उपयोग करना चाहते हैं? – SteadyEddi

उत्तर

14

क्या आप सही किया जाना चाहिए है, तो आप LoadOptions आप पहले से ही तय कर रहे हैं के अलावा इस dataContext.DeferredLoadingEnabled = false; जोड़ने की जरूरत है।

+0

यह सुझाव मेरे लिए काम किया। मैं एक ही डेटा संदर्भ का उपयोग कर एक दूसरी क्वेरी में चाइल्ड 2 भाई डेटा प्राप्त करने में सक्षम था। DeferredLoading को गलत पर सेट करके मैं चाइल्ड 2 परिणाम सेट को पहले क्वेरी के साथ विलय करने में सक्षम था, बिना किसी डेटा सेट को आलसी लोड करने का प्रयास किए जाने से पहले मैं डेटा सेट कर सकता था। अगर किसी के पास पुनर्प्राप्ति के लिए अन्य विचार हैं तो मैं उन सुझावों का भी स्वागत करूंगा। धन्यवाद नाट। – Scott

0
var children2 = from child2 in dataContext.Child2 
       where children.Any(c1 => c1.Parent == child2.Parent) 
       select child2; 

परिणामस्वरूप एक ही मौजूद प्रश्न होनी चाहिए, इसलिए यह दो प्रश्नों को समाप्त कर देगा।

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