8

UserFriends नामक एक तालिका है जिसमें उपयोगकर्ताओं की दोस्ती के लिए रिकॉर्ड हैं। प्रत्येक दोस्ती के लिए, वहाँ सिर्फ एक रिकॉर्ड,यह सुनिश्चित करने के लिए कि उपयोगकर्ता मित्र हैं या नहीं, एक कुशल इकाई फ्रेमवर्क क्वेरी क्या है?

User1ID User2ID IsConfirmed 
1  2  true 

जो

User1ID User2ID IsConfirmed 
2  1  true 

लेकिन दोनों लिए व्यापार तर्क के मामले में बराबर है एक जोड़ी के लिए नहीं हो सकता है।

क्या है सबसे कारगर (अभी तक पठनीय और नहीं सादे एसक्यूएल शामिल) Entity Framework क्वेरी यदि उपयोगकर्ता एक उपयोगकर्ता बी के मित्र हैं निर्धारित करने के लिए, पर विचार हम नहीं जानते कि जो उनमें से पहली या दूसरी कॉलम में है ?

मेरे प्रयास सादा और स्पष्ट है:

public bool AreFriends (int user1Id, int user2Id) 
{ 
    return MyObjectContext.UserFriends 
     .Any (uf => uf.IsConfirmed && (
        (uf.UserID == user1Id && uf.FriendUserID == user2Id) 
        || (uf.UserID == user2Id && uf.FriendUserID == user1Id) 
     )); 
} 

वहाँ || यहाँ की तुलना में एक बेहतर तरीका है?

+2

यदि उपयोगकर्ता 1ID और User2ID कॉलम प्राथमिक कुंजी कॉलम हैं तो यह क्वेरी इंडेक्स स्कैन का कारण बनती है और यह बहुत ही कुशल है। क्या आपने इस क्वेरी की निष्पादन योजना देखी थी? – Arian

+0

@ निमा: नहीं मैंने नहीं किया। तो, क्या उन्हें दोनों कुंजी के रूप में क्वेरी को कुशल बनाते हैं? मैं वास्तव में एक डेटाबेस लड़का नहीं हूं और इस तरह इनपुट की सराहना करता हूं। क्या आप अपनी टिप्पणी को उत्तर के रूप में पोस्ट कर सकते हैं, इसलिए मैं इसे ऊपर उठा सकता हूं, और अगर कुछ और नहीं हो जाता है तो इसे सही के रूप में चिह्नित करें? –

+0

@gaearon - नहीं, वे 'कुंजी के रूप में दोनों' नहीं हैं, जब आप तालिका पर अपनी प्राथमिक कुंजी/क्लस्टर इंडेक्स बनाते हैं तो यह उपयोगकर्ता 1ID और UserID2 दोनों में होना चाहिए। – Phill

उत्तर

6

मुझे लगता है कि यदि उपयोगकर्ता 1ID और User2ID कॉलम प्राथमिक कुंजी कॉलम हैं तो यह क्वेरी इंडेक्स की तलाश करती है और यह बहुत ही कुशल है। निष्पादन योजना का विश्लेषण किए बिना, जब यह महत्वपूर्ण है, तो क्वेरी की ट्यूनिंग अक्षम है। महत्वपूर्ण प्रश्नों के लिए, मेरा सुझाव है कि आप अपने प्रश्नों को लिखने और विश्लेषण करने के लिए SQL सर्वर (या किसी भी डीबीएमएस) का उपयोग करें और फिर इन प्रश्नों को LINQ क्वेरीज़ में कनवर्ट करें। यह मुश्किल नहीं है।

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