का उपयोग कर सबक्वायरी पर फ़िल्टरिंग मैं फ़िल्टरिंग के लिए Dynamic LINQ Library का उपयोग कर एक बड़े एप्लिकेशन पर काम कर रहा हूं।डायनामिक LINQ
अपने डेटा का उपयोग परत में कक्षाओं के सभी पूर्वज एक ही थे DALAncestor जो अन्य बातों के अलावा, को परिभाषित करता है विधि GetData से प्राप्त कर रहे: सार्वजनिक सार सूची GetData (फिल्टर फिल्टर)
के लिए इस विधि का एक कार्यान्वयन (सरलीकृत) एक ग्राहक इस प्रकार दिखाई देगा:
public override List<Entities.Customer> GetData(Filter filter) {
var customers = from c in db.Customers
select new Entites.Customer {
ID = c.ID,
FullName = c.Name,
Country = c.Country
};
return = filter.Apply(customers).ToList();
}
"लागू करें" एक तरीका है जिसके स्थिति का एक संग्रह लेता है और गतिशील LINQ पुस्तकालय का उपयोग कर उन सभी को लागू होता है है।
विधि GetData इस तरह कहा जाता है:
private void DemoCallGetDataMethod() {
var filter = new Filter();
filter.AddCondition("Country", "Austria");
var list = myCustomerDAL.GetData(filter);
// do something
}
एसक्यूएल सर्वर एक का चयन करें बयान हो जाता है:
SELECT [t0].ID, [t0].Name, [t0].Country
FROM Customer [t0]
WHERE [t0].Country = @p0
(@ p0 अपने मूल्य के लिए "ऑस्ट्रिया" सेट के साथ एक पैरामीटर है)।
सबकुछ बढ़िया काम करता है, अगर मैं केवल "शीर्ष" (मास्टर) स्तर पर मान फ़िल्टर करना चाहता हूं। हालांकि, चूंकि मैं फ़िल्टर फॉर्म पर उपयोगकर्ता के इनपुट पर अपना फ़िल्टर बनाता हूं, ऐसे मामले हैं जिनमें उपयोगकर्ता मूल्य से विस्तार से फ़िल्टर करना चाहते हैं (यानी फ़िल्टर किए जाने वाले कॉलम केवल उपयोगकर्ता द्वारा "खोज" पर क्लिक करने के बाद ही ज्ञात होते हैं)।
मुझे इसके लिए कोई समाधान नहीं मिल रहा है: "ऑस्ट्रिया के सभी ग्राहकों को प्राप्त करें, जिन्होंने पेप्सी खरीदी"।
मैंने कई चीजों की कोशिश की है, उनमें से कोई भी काम नहीं कर रहा है।
System.InvalidOperationException:: नहीं सामान्य विधि 'शामिल' पर
public override List<Entities.Customer> GetData(Filter filter) { var customers = from c in db.Customers select new Entites.Customer { ID = c.ID, FullName = c.Name, Country = c.Country, Items = c.Order.SelectMany(o => o.Item).Select(i => i.ItemId).ToList() }; return = filter.Apply(customers).ToList(); } private void DemoCallGetDataMethod() { var filter = new Filter(); filter.AddCondition("Country","=", "Austria"); filter.AddCondition("Items","Contains", "11"); // 11 = Id for Pepsi var list = myCustomerDAL.GetData(filter); // do something }
exepction फेंक दिया है करने के लिए अपने कोड
1. Add support for CONTAINS DynamicLibrary
2. इसमें बदलें: मूल विचार है टाइप करें 'System.Linq.Enumerable' आपूर्ति प्रकार तर्क और तर्क के साथ संगत है। यदि विधि गैर-सामान्य है तो कोई प्रकार का तर्क प्रदान नहीं किया जाना चाहिए।
क्या किसी को पता है कि मैं क्या गलत कर रहा हूं? या मैं बस गलत दिशा में जा रहा हूं और मुझे किसी अन्य दृष्टिकोण की कोशिश करनी चाहिए? कौन कौन से? :)
संपादित: बदल मेरी उदाहरण
क्षमा करें Iam नहीं यकीन है कि क्या आप के बाद कर रहे हैं, लेख आप का उल्लेख भी एक जवाब एक ही समस्या आप कर रहे हैं करने के लिए प्रदान की गई है उस अपवाद से बचने के लिए सामना करना पड़ रहा है। और क्योंकि आप उस मार्ग का पालन करना चाहते हैं, मैं वास्तव में समझ नहीं पा रहा हूं कि आप क्या कर रहे हैं :)? – user182630
फ़िल्टर। एडकंडिशन ("आइटम", "युक्त", "पेप्सी"); - यह केवल स्ट्रिंग और स्ट्रिंग के लिए काम करता है, सूची और स्ट्रिंग –
Tsabo
@ user182630 मैं सामान्य रूप से उप-चयनों से मूल्यों द्वारा फ़िल्टर करने में सक्षम होना चाहता हूं, न कि केवल एक विशिष्ट मामले के लिए। उस आलेख का दृष्टिकोण केवल तभी काम करता है जब आप हार्ड कोड फ़िल्टर करते हैं, जो एक चीज नहीं है जो मैं कर सकता हूं। –