2016-04-11 7 views
6

यह accessing dynamic objects in F# पर एक और लेना है, मैं क्वेरी को पैरामीट्रिज करने और आवश्यक वस्तुओं को निकालने के लिए let y = x.Where(fun x -> x.City ="London").Select("new(City,Zip)") का उपयोग कर रहा हूं। ये एक SQL क्वेरी में स्तंभों के अनुरूप होंगे, और डेटाकॉन्टेक्स्ट की एक संपत्ति द्वारा प्रतिनिधित्व किया जाएगा। यह वह हिस्सा है जिसे मैं पैरामीटर के रूप में पास करना चाहता हूं।पैरामैट्रिक LINQ क्वेरी

type Northwind = ODataService<"http://services.odata.org/Northwind/Northwind.svc"> 
let db = Northwind.GetDataContext() 
let query2 = query { for customer in db.Customers do 
        select customer} |> Seq.toArray 
let qryfun (x:Northwind.ServiceTypes.Customer) = 
    query { for x in query2 do 
      select (x.City,x.CompanyName,x.Country)} 

मूल रूप से मैं न केवल x लेकिन यह भी x.* में पारित करने के लिए करना चाहते हैं। चूंकि मैं तय किया गया एक डेटाबेस एक्सेस कर रहा हूं, मैं एक्स को कारक बना सकता हूं। हालांकि अब मेरे पास विभिन्न कॉलम निकालने वाले 40 छोटे कार्य हैं। क्या यह एक समारोह में कारक बनाना संभव है और संपत्ति को तर्क के रूप में पास करना संभव है? तो कभी-कभी मैं x.City निकालता हूं लेकिन अन्य समय x.Country। मैंने कोटेशन का उपयोग करने का प्रयास किया है, हालांकि इसे ठीक से विभाजित नहीं किया जा सकता है और शायद यह सही दृष्टिकोण नहीं है।

+0

मुझे लगता है कि तुम सिर्फ 'का चयन करें (ग्राहक, customer.City)' 'और अपने qryfun' जैसी क्वेरी से लौट सकते हैं टपल एक के रूप में स्वीकार करेंगे टपल पैरामीटर चूंकि सभी प्रकार के ग्राहक गुणों में स्थिर प्रकार नहीं है, इसलिए आप या तो कार्यों/परिवर्तनों के बीच मध्यवर्ती डेटा प्रवाह के लिए टुपल्स का उपयोग करते हैं या अपना खुद का रिकॉर्ड प्रकार परिभाषित करते हैं और इसे अपनी क्वेरी – paulik

+0

@paulik thx में मैप करते हैं। मुझे यकीन नहीं है कि यह करने योग्य है। जैसे 'क्वेरी 2 में x के लिए qryfun (x, x.column) = क्वेरी { का चयन करें (x.column)}' जहां x डीबी तालिका (Northwind.ServiceTypes.Customer) है और x.column एक कॉलम (या फ़ील्ड है) ग्राहक तालिका में, यह x.City, x.Country, आदि हो सकता है .... तो मैं 'qryfun (Northwind.ServiceTypes.Customer, Northwind.ServiceTypes.Customer.City) को कॉल करूंगा 'दूसरा तर्क मुश्किल है क्योंकि Northwind.ServiceTypes.Customer.City तालिका में नहीं प्रत्येक रिकॉर्ड से संबंधित है। यदि आप संदर्भित प्रश्न पर एक नज़र डालते हैं, तो मैं इसे एक स्ट्रिंग ("नया (शहर, देश)" से दबाता हूं) – s952163

उत्तर

7

उद्धरण स्प्लिसिंग के बारे में, यह मेरे लिए काम करता है:

open System.Linq 

type record = { x:int; y:string } 

let mkQuery q = 
    query { 
     for x in [{x=1;y="test"}].AsQueryable() do 
     select ((%q) x) 
    } 

mkQuery <@ fun r -> r.x, r.y @> 
|> Seq.iter (printfn "%A") 
+0

यह काला जादू है :-) हाँ, वास्तव में, यह एक बहुत साफ समाधान है। धन्यवाद! – s952163