2010-11-17 8 views
17

के लिए एकाधिक कंटेनर/किसी के साथ लिंक क्वेरी मेरे पास एक दस्तावेज़ वर्ग है जिसमें "टैग" की एक सूची है। की तरह कुछ:रैंक डीबी

class Item { 
    string Name { get; set; } 
    List<string> Tags {get; set;} 
} 

अब मुझे लगता है कि मुझे टैग की एक सूची के आधार पर फ़िल्टर सभी आइटम हाथ RavenDB के लिए एक प्रश्न बनाना चाहेंगे।

var query = GetQueryable(); 
foreach (var tag in tags) 
{ 
    query = query.Where(i => i.Tags.Contains(tag)); 
} 

बहरहाल, यह, RavenDB के साथ काम करने की संभावना सबसे अधिक है क्योंकि शामिल समर्थित नहीं है प्रतीत नहीं होता है .. मैं भी इसे फिर से लिखने की कोशिश की है: इकाई की रूपरेखा का उपयोग करते समय मैं कुछ इस तरह से यह करने के लिए प्रबंधित किसी भी उपयोग करते हुए, (Where(i => i.Tags.Any(t=>t == tag))), लेकिन है कि मुझे एक अजीब अपवाद देता है:

Unable to cast object of type 
'System.Linq.Expressions.PrimitiveParameterExpression`1[System.String]' 
to type 'System.Linq.Expressions.MemberExpression 

किसी भी महान विचार? क्या मैं यह पूरी तरह से गलत कर रहा हूँ?

+0

'GetQueryable()' वापसी प्रकार क्या है? और आप 'query = query में क्या कर रहे हैं। जहां (i => i.Tags.Contains (टैग));'? क्वेरी प्रकार क्या है? –

+0

GetQueryable() एक IQueryable देता है। हालांकि मेरे पास पूरे दस्तावेज़ सत्र तक पहुंच है, इसलिए यह सिर्फ एक उदाहरण था। – CodingInsomnia

उत्तर

18

शामिल वास्तव में अभी तक समर्थित नहीं है (शायद यह होना चाहिए, लेकिन यह है कि पूरी तरह से एक और बात है - हम केवल वास्तव में जब के लिए अपने पूछा विभिन्न ऑपरेटरों के लिए समर्थन जोड़ने)

किसी के खिलाफ एक से अधिक प्रश्नों के लिए के रूप में, मैं तुम्हें ग्रहण ' गतिशील डेटा करने के लिए प्रयास कर रहे हैं और आप जैसे

"X OR Y OR Z" 

एक मुश्किल से एक है यही कारण है कि कुछ हासिल करना चाहते हैं, और LINQ प्रदाता डिफ़ॉल्ट रूप से उन कई कुल जाएगा कहां खंड के साथ और है, तो आपके उदाहरण लग रहा है

तरह
"X AND Y AND Z" 

जो स्पष्ट रूप से मामला कभी नहीं होगा।

var results = s.Advanced.LuceneQuery<Item>() 
        .Where(string.Format("Tags,:({0})", string.Join(" OR ", tags))); 

मेक भावना:

इस एक के लिए आपका सबसे अच्छा विकल्प Lucene क्वेरी (कम से कम अब के लिए) के लिए ड्रॉप डाउन और इस तरह कुछ करने के लिए है?

क्वेरी से ऊपर की तरह

"Tags,:(X OR Y OR Z)" 

नोट दिखेगा: "टैग" RavenDB सूचित करता है कि टैग एक सरणी

ठीक है, [संपादित करें] है!

सबसे आसान तरीका क्या आप वास्तव में चाहते हैं, इन पंक्तियों

   new IndexDefinition<Item, Item>() 
       { 
        Map = docs => from doc in docs 
            select new 
            { 
             Tags = doc.Tags 
            }, 
        Indexes = {{ x => x.Tags, FieldIndexing.Analyzed }} 
       }.ToIndexDefinition(store.Conventions)); 

फिर अपने ands के लिए क्वेरी करने के लिए साथ कुछ करने के लिए है आप कुछ इस तरह कर सकते हैं:

   var results = s.Advanced.LuceneQuery<Item, WhateverYouCalledThatIndex>() 
        .Where(string.Format("Tags:({0})", string.Join(" AND ", tags))); 

अब, चीजों को

 Tags = doc.Tags 

वाई से अवगत होना चाहिए उस सरणी को एक विशाल ब्लॉब में क्रमबद्ध कर देगा, क्योंकि यह केवल तार है जो इस उदाहरण के लिए काम करेगा।

मैं इसे व्यक्त करने के बेहतर तरीके देख रहा हूं, यह संभावना नहीं है कि हम ऐसा करने के लिए LINQ-ish तरीके से आएंगे, क्योंकि यह वास्तव में बहुत अच्छी तरह से मानचित्र नहीं है - लेकिन यह है जवाब यह है कि काम करेंगे :)

मुझे लगता है कि मैं काफी कम से कम ऐसा करने में सक्षम होना चाहते हैं

Map = docs => from doc in docs 
            select new 
            { 
             Tags = String.Join(" ", doc.Tags) 
            }, 

(यह बहुत काम नहीं करेगा यह कोशिश मत करो), लेकिन यह एक सा है आप जो हासिल करना चाहते हैं उसके बारे में अधिक स्पष्ट।

+0

बंद करें, लेकिन कोई सिगार नहीं! ;-) सबसे पहले, मैं जिस संस्करण का उपयोग करता हूं वह "टैग ,:" वाक्यविन्यास के साथ काम नहीं करता है। हालांकि अगर मैं एक नाम के साथ एक टैग क्लास बनाता हूं जिसे नाम कहा जाता है (और "टैग, नाम:" का उपयोग करें), तो आपका समाधान काम करता है। लेकिन यह वही नहीं करता जो मुझे चाहिए। मैं इसे केवल उन आइटम्स को वापस करना चाहता हूं जिनमें टैग सूची में सभी टैग हैं (टैग में से कोई भी नहीं)। – CodingInsomnia

+0

ठीक है, यह अधिक कठिन है, आप इसे एक रिलेशनल डेटाबेस में सेट आधारित ऑपरेशन के रूप में कैसे करेंगे? मुझे लगता है कि इस बिंदु पर आपको वास्तव में उन टैग को एक फ़ील्ड में मर्ज करने के लिए एक इंडेक्स बनाना होगा और आप जो विश्लेषक चाहते हैं उसे निर्दिष्ट करें, और "इन सभी शर्तों को कृपया" –

+0

कहने के लिए ल्यूसीन क्वेरी का उपयोग करें, हाँ, यह बहुत सुंदर नहीं है एक रिलेशनल डीबी में या तो, लेकिन प्रश्न में मैंने जो कोड लिखा था वह वास्तव में एंटिटी फ्रेमवर्क के साथ काम करता है। हालांकि सुंदर नहीं है, और शायद ही बहुत ही कुशल (जो कारण मैंने पाया था कि शायद रावेन बेहतर काम करने में सक्षम होंगे)। – CodingInsomnia

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