2010-05-05 18 views
6

.NET 4 और मल्टीकोर वातावरण में, क्या SQLL डेटाकोड्सटेक्स्ट ऑब्जेक्ट का उपयोग करते हैं, तो हम डेटा समान लोड का उपयोग करते हैं।LinqToSql - समांतर - डेटाकॉन्टेक्स्ट और समांतर

संपादित

मैं एसक्यूएल को LINQ पता साधारण प्रश्नों parallelize नहीं है। मैं क्या जानना चाहता हूं जब हम DataLoadOption.LoadWith निर्दिष्ट करते हैं, क्या यह प्रत्येक इकाई और इसकी उप-इकाइयों के बीच मिलान करने के लिए समांतरता का उपयोग करता है?

उदाहरण:

Select Id,Name from Categories 
Select Id,Name, CategoryId from Products where p.SomeCondition 

जब सभी उत्पादों बनाई गई हैं, हम एक

categories.ToArray(); 
Parallel.Foreach(products, p => 
{ 
    p.Category == categories.FirstOrDefault(c => c.Id == p.CategoryId); 
}); 

या

+०१२३५१६४१०६१ होगा:

using(MyDataContext context = new MyDataContext()) 
{ 
    DataLaodOptions options =new DataLoadOptions(); 
    options.LoadWith<Product>(p=>p.Category); 
    return this.DataContext.Products.Where(p=>p.SomeCondition); 
} 

निम्नलिखित एसक्यूएल उत्पन्न करता है

categories.ToArray(); 
foreach(Product product in products) 
{ 
    product.Category = categories.FirstOrDefault(c => c.Id == product.CategoryId); 
} 

?

+0

अपने पसंदीदा उत्तर को चिह्नित करने के लिए मत भूलना ;-) – Steven

+0

@Steven: मैं अपने संपादन के जवाब की उम्मीद कर रहा था ... – Gregoire

+0

एल 2 एस के अंदर कभी भी समानांतर अनुकूलन नहीं है। मेरा अपडेट देखें। – Steven

उत्तर

10

नहीं, LINQ से SQL नहीं है। .NET पक्ष पर समानांतर करने के लिए बहुत कम है। सभी LINQ से SQL SQL अभिव्यक्ति पेड़ को SQL क्वेरीज़ में अनुवाद कर रहा है। SQL सर्वर उन SQL कथन निष्पादित करेगा, और समानांतर में ऐसा करने में सक्षम है।

मत भूलना कि आप अपने LINQ के साथ कुछ इस तरह कर सकते हैं, जबकि LINQ क्वेरी SQL करने के लिए, यह एक अच्छा विचार नहीं है:

// BAD CODE!!! Don't parallelize a LINQ to SQL query 
var q = 
    from customer in db.Customers.AsParallel() 
    where customer.Id == 5 
    select customer; 

इस पैदावार जबकि सही परिणाम, आप ऐसा नहीं करेंगे आप जिस प्रदर्शन सुधार की उम्मीद कर रहे हैं उसे प्राप्त करें। PLINQ IQueryable ऑब्जेक्ट्स को संभालने में सक्षम नहीं है। इसलिए, यह IEnumerable (इस प्रकार इसे पुनरावृत्त) के रूप में IQueryable को संभाल लेंगे। यह db.Customers समानांतर में संग्रह को संसाधित करेगा और ग्राहकों को फ़िल्टर करने के लिए एकाधिक धागे का उपयोग करेगा। हालांकि यह ठीक लगता है, इसका मतलब है कि यह डेटाबेस से ग्राहकों का पूरा संग्रह पुनर्प्राप्त करेगा! AsParallel निर्माण के बिना, LINQ से SQL SQL में WHERE id = @ID जोड़कर इस क्वेरी को अनुकूलित करने में सक्षम होगा। एसक्यूएल सर्वर मान लाने के लिए इंडेक्स (और संभवतः एकाधिक-धागे) का उपयोग करने में सक्षम होगा।

जबकि LINQ से SQL इंजन के अंदर ऑप्टिमाइज़ेशन के लिए कुछ जगह है, जब इसकी उप-इकाइयों से मेल खाने वाली इकाइयों की बात आती है, तो वर्तमान में ढांचे में ऐसा अनुकूलन प्रतीत नहीं होता है (या कम से कम, मैं सक्षम नहीं था परावर्तक का उपयोग कर कोई भी ढूंढें)।

+0

आपके उत्तर के लिए धन्यवाद। मैं इस विशिष्ट मामले के लिए यह जानता था। मैं यह जानना चाहता हूं कि क्या होता है जब dataloadoptions निर्दिष्ट होते हैं? – Gregoire

+0

मुझे खेद है। मुझे यकीन नहीं है कि आप क्या जानना चाहते हैं। जहां तक ​​मुझे पता है, LINQ से SQL समानांतर संरचनाओं का उपयोग करके आंतरिक त्वरण नहीं करेगा। बेशक आप LINQ से SQL प्राप्त करने के दौरान PLINQ (ऑब्जेक्ट्स) के साथ .NET स्पेस में अपना स्वयं का समानांतर अनुकूलन करने के लिए स्वतंत्र हैं। – Steven