मैंने हाल ही में VS 2010 में अपग्रेड किया है और मैं LINQ से डेटासेट के आसपास खेल रहा हूं। मेरे पास प्राधिकरण के लिए एक मजबूत टाइप की गई डेटासेट है जो एक ASP.NET WebApplication के HttpCache में है।
इसलिए मैं यह जानना चाहता था कि वास्तव में यह जांचने का सबसे तेज़ तरीका है कि कोई उपयोगकर्ता कुछ करने के लिए अधिकृत है या नहीं। यहाँ मेरा डेटामोडेल और कुछ अन्य informations है अगर कोई दिलचस्पी रखता है।
मैंने 3 तरीके जाँचे हैं:
- प्रत्यक्ष डेटाबेस
- LINQ क्वेरी "जॉइन" के रूप में कहां की शर्तों के साथ - सिंटैक्स
- LINQ क्वेरी Join - सिंटैक्स के साथ
ये प्रत्येक फ़ंक्शन पर 1000 कॉल के साथ परिणाम हैं:
1.Iteration:
- 4,2841519 सेकंड।
- 115,7796925 सेकंड।
- 2,024749 सेकंड।
2.Iteration:
- 3,1954857 सेकंड।
- 84,97047 सेकंड।
- 1,5783397 सेकंड।
3.Iteration:
- 2,7922143 सेकंड।
- 97,8713267 सेकंड।
- 1,8432163 सेकंड।
औसत:
- डेटाबेस: 3,4239506333 सेकंड।
- कहां: 99,5404964 सेकंड।
- जुड़ें: 1,815435 सेकंड।
जहां-सिंटैक्स की तुलना में जॉइन-वर्जन इतना तेज क्यों है जो इसे बेकार बनाता है हालांकि एक LINQ नौसिखिया के रूप में यह सबसे सुपाच्य लगता है। या मैं अपने प्रश्नों में कुछ याद किया है?
यहाँ LINQ प्रश्न हैं, मैं डेटाबेस को छोड़ देता हूँ:
कहां :
Public Function hasAccessDS_Where(ByVal accessRule As String) As Boolean
Dim userID As Guid = DirectCast(Membership.GetUser.ProviderUserKey, Guid)
Dim query = From accRule In Authorization.dsAuth.aspnet_AccessRule, _
roleAccRule In Authorization.dsAuth.aspnet_RoleAccessRule, _
role In Authorization.dsAuth.aspnet_Roles, _
userRole In Authorization.dsAuth.aspnet_UsersInRoles _
Where accRule.idAccessRule = roleAccRule.fiAccessRule _
And roleAccRule.fiRole = role.RoleId _
And userRole.RoleId = role.RoleId _
And userRole.UserId = userID And accRule.RuleName.Contains(accessRule)
Select accRule.idAccessRule
Return query.Any
End Function
में शामिल हों:
Public Function hasAccessDS_Join(ByVal accessRule As String) As Boolean
Dim userID As Guid = DirectCast(Membership.GetUser.ProviderUserKey, Guid)
Dim query = From accRule In Authorization.dsAuth.aspnet_AccessRule _
Join roleAccRule In Authorization.dsAuth.aspnet_RoleAccessRule _
On accRule.idAccessRule Equals roleAccRule.fiAccessRule _
Join role In Authorization.dsAuth.aspnet_Roles _
On role.RoleId Equals roleAccRule.fiRole _
Join userRole In Authorization.dsAuth.aspnet_UsersInRoles _
On userRole.RoleId Equals role.RoleId _
Where userRole.UserId = userID And accRule.RuleName.Contains(accessRule)
Select accRule.idAccessRule
Return query.Any
End Function
पहले ही, आपका बहुत धन्यवाद।
संपादित करें : अधिक सार्थक पूर्णता-मूल्यों को प्राप्त करने के लिए दोनों प्रश्नों पर कुछ सुधारों के बाद, JOIN का लाभ पहले की तुलना में कई गुना अधिक है:
शामिल हों :
Public Overloads Shared Function hasAccessDS_Join(ByVal userID As Guid, ByVal idAccessRule As Int32) As Boolean
Dim query = From accRule In Authorization.dsAuth.aspnet_AccessRule _
Join roleAccRule In Authorization.dsAuth.aspnet_RoleAccessRule _
On accRule.idAccessRule Equals roleAccRule.fiAccessRule _
Join role In Authorization.dsAuth.aspnet_Roles _
On role.RoleId Equals roleAccRule.fiRole _
Join userRole In Authorization.dsAuth.aspnet_UsersInRoles _
On userRole.RoleId Equals role.RoleId _
Where accRule.idAccessRule = idAccessRule And userRole.UserId = userID
Select role.RoleId
Return query.Any
End Function
कहां :
Public Overloads Shared Function hasAccessDS_Where(ByVal userID As Guid, ByVal idAccessRule As Int32) As Boolean
Dim query = From accRule In Authorization.dsAuth.aspnet_AccessRule, _
roleAccRule In Authorization.dsAuth.aspnet_RoleAccessRule, _
role In Authorization.dsAuth.aspnet_Roles, _
userRole In Authorization.dsAuth.aspnet_UsersInRoles _
Where accRule.idAccessRule = roleAccRule.fiAccessRule _
And roleAccRule.fiRole = role.RoleId _
And userRole.RoleId = role.RoleId _
And accRule.idAccessRule = idAccessRule And userRole.UserId = userID
Select role.RoleId
Return query.Any
End Function
1000 कॉल के लिए परिणाम (तेज कंप्यूटर पर)
- सम्मिलित हों | 2. कहाँ
1.Iteration:
- 0,0713669 सेकंड।
- 12,7395299 सेकंड।
2.Iteration:
- 0,0492458 सेकंड।
- 12,3885925 सेकंड।
3.Iteration:
- 0,0501982 सेकंड।
- 13,3474216 सेकंड।
औसत:
- शामिल हों: 0,0569367 सेकंड।
- कहां: 12,8251813 सेकंड।
ज्वाइन करना 225 गुना तेज है
निष्कर्ष: संबंधों को निर्दिष्ट करने के लिए जहां भी संभव हो और जोइन का उपयोग करने से बचें (निश्चित रूप से डेटासेट और Linq-To-Objects
सामान्य रूप से LINQ में)।
Join
, आप एक ऑप्टिमाइज़र पर भरोसा क्यों करते हैं यदि आप शुरुआत से ओपिमाइज्ड कोड लिख सकते हैं? यह आपके इरादों को भी स्पष्ट करता है। तो वही कारण जो आपको sql में JOIN करना चाहिए ।