2008-10-14 15 views
9

में टेबल क्वेरी प्रदर्शन एक LINQ में, क्यों गुण विदेशी कुंजी से बनाए जाते हैं कर रहे हैं EntitySet वस्तुओं, जो IEnumerable, जहां के रूप में DataContext पर वस्तुओं Table वस्तुओं जो IQueryable को लागू कर रहे हैं को लागू?EntitySet बनाम एसक्यूएल वर्ग के लिए LINQ2SQL

संपादित करें: स्पष्टीकरण के लिए, यहां एक उदाहरण है जो बताता है कि मैं क्या समझने की कोशिश कर रहा हूं।

ctx.MatchPlayers.Where(x => x.MatchID == 1) 
       .Max(x => x.Score); 

केवल 1 क्वेरी चलाता है: यह उदाहरण: जहां के रूप में

ctx.Matches.Where(x => x.MatchID == 1).Single() 
      .MatchPlayers.Max(x => x.Score); 

दो बार डेटाबेस पूरी करता है। यहाँ निशान हैं:

exec sp_executesql N'SELECT [t0].[MatchID], [t0].[Date] 
FROM [dbo].[Matches] AS [t0] 
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1 
go 
exec sp_executesql N'SELECT [t0].[MatchID], [t0].[PlayerID], [t0].[Score] 
FROM [dbo].[MatchPlayers] AS [t0] 
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1 
go 

और

exec sp_executesql N'SELECT MAX([t0].[Score]) AS [value] 
FROM [dbo].[MatchPlayers] AS [t0] 
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1 
go 

जो भी है कि, भी बदतर है, अधिकतम सी # स्तर पर करने के बजाय डेटाबेस में किया जाता है पता चलता है।

मुझे पता है कि कारण ऐसा होता है IQueryable और IEnumerable रों बीच का अंतर है, तो क्यों पहले उदाहरण में MatchPlayers वस्तु IQueryable इंटरफ़ेस को लागू नहीं करता है उत्तरार्द्ध उदाहरण के रूप में ही लाभ पाने के लिए।

उत्तर

1

टेबल्स प्रभावी रूप से एक वैचारिक मामले हैं - वे वास्तव में सर्वर पर मौजूद हैं, इसलिए आपको प्रविष्टियां प्राप्त करने के लिए क्वेरी करने की आवश्यकता है। विदेशी कुंजी प्रविष्टियां वास्तव में किसी अन्य क्वेरी द्वारा प्राप्त की जाती हैं, इसलिए उस समय वे स्थानीय रूप से उपलब्ध होते हैं। यह एक काफी ऊनी वर्णन है, लेकिन उम्मीद है कि यह सामान्य अवधारणा पर हो जाता है।

3
ctx.Matches.Where(x => x.MatchID == 1).Single() 

सिंगल() एक मैच लौटाता है, एक IQueryable (मैच) नहीं।

बस एकल() धक्का अंतिम चरण के लिए रवाना:

ctx.Matches 
    .Where(m => m.MatchID == 1) 
    .Select(m => m.MatchPlayers.Max(mp => mp.Score)) 
    .Single(); 

क्या इस क्वेरी से पता चलता है, कि यह एक प्रश्न में MatchPlayers संपत्ति का उपयोग करने के ठीक है। जो पूछताछ के प्रश्न की मेरी व्याख्या को संबोधित करता है - "मैं एक क्वेरी में एंटिटीसेट का उपयोग क्यों नहीं कर सकता?", आप कर सकते हैं।

0

यह addressed on the MSDN forums था। तर्क का अर्थ यह है कि डेटाबेस के विरुद्ध प्रश्न बनाते समय अतिरिक्त और हटाए गए ऑब्जेक्ट्स को ट्रैक करना बहुत मुश्किल है। इसके बजाए, EntitySet संबंधित वस्तुओं की स्थानीय प्रतिलिपि में से कुछ है जिसे आप कुशल बना सकते हैं। दुर्भाग्यवश, जैसा कि आपने देखा है, इसका बेहतर प्रदर्शन LINQ से SQL के बजाय LINQ से ऑब्जेक्ट्स कॉल में अभिव्यक्तियों को अभिव्यक्त करने का दुष्प्रभाव है।

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

  • कोई संबंधित समस्या नहीं^_^