/ / एफ # नल रिकॉर्ड्स से निपटना डेटाबेस से वापस लौटा - .net, f #, servicestack.redis

एफ # नल रिकॉर्ड्स के साथ लेन-देन डेटाबेस से लौटा - .net, f #, servicestack.redis

किसी डेटाबेस से अद्वितीय आइटम पुनर्प्राप्त करते समय मुझे उस परिदृश्य को पूरा करने की आवश्यकता होती है जब ग्राहक द्वारा प्रदान की गई आईडी के लिए कोई डेटा नहीं होता है। उदाहरण के लिए, आईडी गलत है या कैश किए गए डेटा की समय सीमा समाप्त हो गई है।

इस उदाहरण में उपयोग की जाने वाली विशेष डीबी क्लाइंट लाइब्रेरी ServiceStack.Redis है, लेकिन मुझे लगता है कि सिद्धांत किसी भी सीएलआर लाइब्रेरी पर लागू होता है।

मैंने नीचे दिखाए गए रिकॉर्ड प्रकार का उपयोग करके अपनी डेटा संरचना को परिभाषित किया है। अब, जब मैं क्लाइंट लाइब्रेरी का उपयोग उस कुंजी के लिए डेटा पुनर्प्राप्त करने के लिए करता हूं जो डेटाबेस में मौजूद नहीं है null मूल्य वापस आ गया है। यह, मैं उम्मीद करता हूं और खुश हूं। समस्या यह है कि एफ # कंपाइलर मुझे इस परिदृश्य के लिए पैटर्न मैच नहीं देगा - भले ही यह रनटाइम पर हो!

type MyRecordType = { id:int; name:string; desc:string }

let redis = new RedisClient("localhost")
let nullCheck =
let item = redis.Get<MyRecordType> "xxx"
// it is possible that item is null
// but the compiler will not permit the match
match item with
| null -> None
| _ -> Some item

रेडिस क्लाइंट लाइब्रेरी में "कंटेनसकी" शामिल हैएक बूलियन लौटने की विधि जिसे मैं पहले उपयोग कर सकता था लेकिन डेटाबेस में दो कॉल अनावश्यक है। दूसरी तरफ सी # प्रोजेक्ट में डेटा संरचना के रूप में परिभाषित कक्षा का उपयोग करना है, लेकिन इसमें बहुत अधिक ओवरहेड शामिल है। विशेषता भी एक मैच परमिट की अनुमति नहीं देता है null.

मैं जानना चाहता हूं कि इस परिदृश्य से निपटने के लिए मुझे किस सम्मेलन का उपयोग करना चाहिए क्योंकि यह एक बहुत ही आम समस्या की तरह लगता है?

उत्तर:

उत्तर № 1 के लिए 4

दुर्भाग्य से आप इसका उपयोग नहीं कर सकते हैं AllowNullLiteral रिकॉर्ड पर नतीजतन, सबसे अच्छा समाधान सिर्फ एक शून्य मूल्य बनाना है और समानता जांच करना है

if item = Operators.Unchecked.defaultof<_> then None else Some(item)

जवाब के लिए 3 № 2

मैंने भी पाया यह लेख जो मुक्केबाजी का उपयोग करता है। मुझे लगता है कि यह थोड़ा क्लीनर पढ़ता है:

if (box item = null) then None else Some item

जवाब के लिए 3 № 3

मुझे लगता है कि यह थोड़ा बेहतर प्रदर्शन कर सकता हैमैंने देखा है कि अन्य विकल्प। एफ # बराबर ऑपरेटर बहुत शक्तिशाली है, लेकिन यह भी बहुत अधिक है जब आप वास्तव में जानना चाहते हैं कि क्या आपके पास शून्य संदर्भ है या नहीं।

if obj.ReferenceEquals(item, null) then None else Some item

इससे कोई फर्क नहीं पड़ता कि आप "एक कर रहे हैं बहुत तुलना की, लेकिन एक वास्तविक अंतर है:

> for i = 1 to 100000000 do bar = null |> ignore;;
Real: 00:00:00.233, CPU: 00:00:00.234, GC gen0: 0, gen1: 0, gen2: 0
val it : unit = ()
> for i = 1 to 100000000 do obj.ReferenceEquals(bar, null) |> ignore;;
Real: 00:00:00.030, CPU: 00:00:00.031, GC gen0: 0, gen1: 0, gen2: 0