2011-11-17 14 views
5

का उपयोग कर सबक्वायरी पर फ़िल्टरिंग मैं फ़िल्टरिंग के लिए 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' आपूर्ति प्रकार तर्क और तर्क के साथ संगत है। यदि विधि गैर-सामान्य है तो कोई प्रकार का तर्क प्रदान नहीं किया जाना चाहिए।

क्या किसी को पता है कि मैं क्या गलत कर रहा हूं? या मैं बस गलत दिशा में जा रहा हूं और मुझे किसी अन्य दृष्टिकोण की कोशिश करनी चाहिए? कौन कौन से? :)

संपादित: बदल मेरी उदाहरण

+0

क्षमा करें Iam नहीं यकीन है कि क्या आप के बाद कर रहे हैं, लेख आप का उल्लेख भी एक जवाब एक ही समस्या आप कर रहे हैं करने के लिए प्रदान की गई है उस अपवाद से बचने के लिए सामना करना पड़ रहा है। और क्योंकि आप उस मार्ग का पालन करना चाहते हैं, मैं वास्तव में समझ नहीं पा रहा हूं कि आप क्या कर रहे हैं :)? – user182630

+0

फ़िल्टर। एडकंडिशन ("आइटम", "युक्त", "पेप्सी"); - यह केवल स्ट्रिंग और स्ट्रिंग के लिए काम करता है, सूची और स्ट्रिंग – Tsabo

+0

@ user182630 मैं सामान्य रूप से उप-चयनों से मूल्यों द्वारा फ़िल्टर करने में सक्षम होना चाहता हूं, न कि केवल एक विशिष्ट मामले के लिए। उस आलेख का दृष्टिकोण केवल तभी काम करता है जब आप हार्ड कोड फ़िल्टर करते हैं, जो एक चीज नहीं है जो मैं कर सकता हूं। –

उत्तर

2

@ user182630 मैं में subselects से मूल्यों के आधार पर फ़िल्टर करने के लिए सक्षम होना चाहते हैं सामान्य, न केवल एक विशेष मामले के लिए। उस आलेख से दृष्टिकोण केवल तभी काम करता है जब आप हार्ड कोड फ़िल्टर करते हैं, जो कि कोई चीज नहीं है जिसे मैं कर सकता हूं। - मार्को Juvančič 9 मिनट पहले

इस लेख http://csharpindepth.com/articles/chapter5/closures.aspx

2

मैं अपने अनुप्रयोगों में गतिशील प्रश्नों के लिए PredicateBuilder का उपयोग के माध्यम से एक पढ़ा है।

Predicate Builder

आपके मामले में मुझे लगता है कि यह कुछ तरह होगा:

string MyCountry = "Austria"; 
string MyProductId = 11 

var Predicate = PredicateBuilder.True<db.Customers>(); 
Predicate = Predicate.And(p=>p.Country ==MyCountry && p.Order.SelectMany(o=>o.Item).Where(i=>i.id == 11).Count() >0); 

var list = Customers.Where(Predicate).Select(s=>s).ToList(); 
+0

के बजाय इन्ट्स के साथ एक उदाहरण देना चाहिए। यह दृष्टिकोण "उपयोगकर्ता द्वारा फ़िल्टर किए जाने के बाद ही ज्ञात कॉलम के द्वारा ज्ञात कॉलम" आवश्यकता पर विफल रहता है। –

+0

ठीक है अगर सभी कॉलम अग्रिम में ज्ञात हैं तो यह कोई समस्या नहीं है। – Tsabo

+0

वे नहीं हैं। विधि "लागू करें" फ़िल्टर कॉलम के बारे में कुछ भी नहीं जानता है। –

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