2015-04-23 9 views
5

का उपयोग करके गतिशील बनाना, मैं एक गतिशील लिखने की कोशिश कर रहा हूं जहां LINQ का उपयोग करके सभी पंक्तियों को वापस करने के लिए क्लॉज का उपयोग करना है जिसमें स्ट्रिंग सरणी में कोई भी कीवर्ड शामिल है। नतीजों के मुकाबले परिणाम वापस नहीं आते हैं और एसक्यूएल को देखकर मैं समस्या देख सकता हूं।डायनामिक कीवर्ड के लिए क्लॉज या IQueryable C# Linq

IQueryable<comments> query = _db.comments; 

if (score != null) 
    query = query.Where(x => x.score == score); 
if (dateFrom != null)3 
    query = query.Where(x => x.date_created >= dateFrom); 
if (dateTo != null) 
    query = query.Where(x => x.date_created <= dateTo); 
if (keywords != null) 
{ 
    //how to use OR for each in array? 
    foreach (var keyword in keywords) 
    { 
     var keywordCondition = keyword; 
     query = query.Where(x => x.text.Contains(keywordCondition)); 
    } 

} 

WHERE ([Extent1].[score] = @p__linq__0) 
AND ([Extent1].[date_created] >= @p__linq__1) 
AND ([Extent1].[date_created] <= @p__linq__2) 
AND ([Extent1].[text] LIKE @p__linq__3 ESCAPE '~') 
AND ([Extent1].[text] LIKE @p__linq__4 ESCAPE '~') 

हो --should

WHERE ([Extent1].[score] = @p__linq__0) 
AND ([Extent1].[date_created] >= @p__linq__1) 
AND ([Extent1].[date_created] <= @p__linq__2) 
AND (([Extent1].[text] LIKE @p__linq__3 ESCAPE '~') 
    OR ([Extent1].[text] LIKE @p__linq__4 ESCAPE '~')) 

मुझे आशा है कि कोई मेरी मदद कर सकते के रूप में मैं कुछ घंटों बिताया है अब एक समाधान के लिए खोज।

अग्रिम

+1

समस्या क्या है और इसका क्या अर्थ है: // कैसे उपयोग करें या सरणी में प्रत्येक के लिए? – MajkeloDev

+0

आप विशिष्टता पैटर्न http://en.wikipedia.org/wiki/Specification_pattern पर एक नज़र डालना चाहते हैं। पैटर्न का एक सरल कार्यान्वयन यहां पाया जा सकता है https://github.com/pmacn/Specific –

उत्तर

3

कि आप समझ गए के रूप में धन्यवाद, इस समस्या को जिसे आप परिवर्तित करने की आवश्यकता होगी के साथ हिस्सा है, क्योंकि यह "और" खंड के सभी होगा है।

//how to use OR for each in array? 
foreach (var keyword in keywords) 
{ 
    var keywordCondition = keyword; 
    query = query.Where(x => x.text.Contains(keywordCondition)); 
} 

मुझे लगता है कि आपको लगता है कि करने के लिए इसे बदलने के द्वारा कर सकते हैं:

query = query.Where(x => keywords.Any(kw => x.text.Contains(kw)); 
+0

दूसरा सुझाव बहुत अच्छा काम करता है - धन्यवाद! –

+0

किया है - चीयर्स @ एलेक्स –

1

आप वास्तव में गतिशील LINQ प्रश्नों पर गौर करना चाहिए (बहुत अच्छी तरह से यहाँ समझाया - http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library)

आप अपनी क्वेरी निर्दिष्ट कर सकते हैं नीचे की तरह -

.Where("Column1 = value1 OR Column2 = value2"); 
+0

जबकि मुझे लगता है और गतिशील LINQ का उपयोग किया है, मुझे नहीं लगता कि यह आवश्यक या उचित है। उन्हें लूप के बजाय बस 'किसी भी' खंड की आवश्यकता है। –

0

मुझे नहीं पता कि क्लीनर तरीका है या नहीं, लेकिन परिवर्तन

foreach (var keyword in keywords) 
    { 
     var keywordCondition = keyword; 
     query = query.Where(x => x.text.Contains(keywordCondition)); 
    } 

query = query.Where(x => keywords.Any(k => x.text.Contains(k)); 

Any() को

एक bool वापस आ जाएगी अगर x.text सूची के किसी भी कीवर्ड शामिल

1

आप विधेय (हालत) बनाने की कोशिश कर रहे हैं गतिशील रूप से सबसे आसान और मुझे ऐसा करने का सबसे लचीला तरीका है जो PredicateBuilder का उपयोग करना है।

http://www.albahari.com/nutshell/predicatebuilder.aspx

यह आप आप एक and या एक or उपयोग कर रहे हैं कि क्या क्वेरी का निर्माण करने पर पूर्ण नियंत्रण देता।

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