[C#] लिंक से एसक्यूएल तक यादृच्छिक पंक्ति


Answers

इकाई फ्रेमवर्क के लिए एक और नमूना:

var customers = db.Customers
                  .Where(c => c.IsActive)
                  .OrderBy(c => Guid.NewGuid())
                  .FirstOrDefault();

यह LINQ से SQL के साथ काम नहीं करता है। OrderBy को बस गिरा दिया जा रहा है।

Question

जब मेरी कोई शर्त हो, तो लिंक से SQL का उपयोग करके यादृच्छिक पंक्ति पुनर्प्राप्त करने का सबसे अच्छा (और सबसे तेज़) तरीका क्या है, उदाहरण के लिए कुछ फ़ील्ड सत्य होना चाहिए?




List<string> lst = new List<string>();
lst.Add("Apple"); 
lst.Add("Guva");
lst.Add("Graps"); 
lst.Add("PineApple");
lst.Add("Orange"); 
lst.Add("Mango");

var customers = lst.OrderBy(c => Guid.NewGuid()).FirstOrDefault();

स्पष्टीकरण: guid (जो यादृच्छिक है) डालने से ऑर्डरबी के साथ क्रम यादृच्छिक होगा।




नीचे दिया गया उदाहरण स्रोत को कॉल करने के लिए स्रोत को कॉल करेगा और उसके बाद 0 और n के बीच की संख्या के साथ स्रोत पर एक स्किप अभिव्यक्ति लागू करेगा। दूसरी विधि यादृच्छिक वस्तु (जो स्मृति में सबकुछ ऑर्डर करेगी) का उपयोग कर ऑर्डर लागू करेगी और विधि कॉल में पारित संख्या का चयन करेगी।

public static class IEnumerable
{
    static Random rng = new Random((int)DateTime.Now.Ticks);

    public static T RandomElement<T>(this IEnumerable<T> source)
    {
        T current = default(T);
        int c = source.Count();
        int r = rng.Next(c);
        current = source.Skip(r).First();
        return current;
    }

    public static IEnumerable<T> RandomElements<T>(this IEnumerable<T> source, int number)
    {
        return source.OrderBy(r => rng.Next()).Take(number);
    }
}



कुशलतापूर्वक हासिल करने का एक तरीका है अपने डेटा में एक कॉलम जोड़ना Shuffle जो एक यादृच्छिक int के साथ पॉप्युलेट होता है (जैसा कि प्रत्येक रिकॉर्ड बनाया गया है)।

यादृच्छिक क्रम में तालिका तक पहुंचने के लिए आंशिक क्वेरी है ...

Random random = new Random();
int seed = random.Next();
result = result.OrderBy(s => (~(s.Shuffle & seed)) & (s.Shuffle | seed)); // ^ seed);

यह उस एक्सओआर के परिणामों द्वारा डेटाबेस और ऑर्डर में एक्सओआर ऑपरेशन करता है।

लाभ: -

  1. कुशल: एसक्यूएल ऑर्डरिंग को संभालता है, पूरी तालिका लाने की आवश्यकता नहीं है
  2. दोहराने योग्य: (परीक्षण के लिए अच्छा) - एक ही यादृच्छिक क्रम उत्पन्न करने के लिए एक ही यादृच्छिक बीज का उपयोग कर सकते हैं

यह प्लेलिस्ट को यादृच्छिक बनाने के लिए मेरे घर स्वचालन प्रणाली द्वारा उपयोग किया जाने वाला दृष्टिकोण है। यह दिन के दौरान एक सतत क्रम देता है (दिन में आसान रोक / फिर से शुरू करने की अनुमति देता है) लेकिन प्रत्येक नए दिन प्रत्येक प्लेलिस्ट पर एक नया रूप देता है।




var cust = (from c in ctx.CUSTOMERs.ToList() select c).OrderBy(x => x.Guid.NewGuid()).Taket(2);

यादृच्छिक 2 पंक्ति का चयन करें




यदि यादृच्छिक पंक्तियां प्राप्त करने का उद्देश्य नमूनाकरण कर रहा है, तो मैंने लार्सन एट अल।, माइक्रोसॉफ्ट रिसर्च टीम के एक अच्छे दृष्टिकोण के बारे में बहुत संक्षेप में बात की है, जहां उन्होंने भौतिक विचारों का उपयोग करके एसक्यूएल सर्वर के लिए एक नमूना ढांचा विकसित किया है। वास्तविक कागज के लिए भी एक लिंक है।




LINQPad में LINQ से SQL का उपयोग C # कथन के रूप में दिखता है

IEnumerable<Customer> customers = this.ExecuteQuery<Customer>(@"SELECT top 10 * from [Customers] order by newid()");
customers.Dump();

जेनरेट एसक्यूएल है

SELECT top 10 * from [Customers] order by newid()



Links