2010-01-06 6 views
5

मेरे पास मेरे आवेदन में एक मामला है जहां उपयोगकर्ता शर्तों की सूची खोज सकता है। खोज को निम्नलिखित क्रम में तीन पास करने की आवश्यकता है:लिंक से एसक्यूएल किसी भी खोजशब्द खोज क्वेरी

  • जो उन्होंने दर्ज किया है उसके सटीक मिलान के लिए। हो गया, आसान
  • एक जहां सभी शब्द (व्यक्तिगत रूप से) मैच। हो गया, भी आसान है।
  • एक जहां शब्द 0 के किसी भी ... कैसे?

अनिवार्य रूप से, मैं कैसे, Sql लिए Linq में, यह यह करने के लिए बताऊँ:

select * from stuff s where s.Title like '%blah%' || s.Title like '%woo&' || s.Title like '%fghwgads%' || s.Title like... 

और इसी तरह?

+0

आपको पता होना चाहिए कि इस तरह की चीज वास्तव में पूर्ण-पाठ खोज द्वारा संभाली जाती है। 'LIKE'% xyz% 'संस्करण चलाएगा, लेकिन प्रदर्शन चूस जाएगा। – Aaronaught

उत्तर

7

यह एक कठिन हो सकता है ... मुझे लगता है कि आपको अपना ऑपरेटर लिखना होगा।

(अद्यतन:। हां, मैं यह परीक्षण किया है, यह काम करता है):

string[] terms = new string[] { "blah", "woo", "fghwgads" }; 
var results = stuff.LikeAny(s => s.Title, terms); 

पी.एस.

public static class QueryExtensions 
{ 
    public static IQueryable<TEntity> LikeAny<TEntity>(
     this IQueryable<TEntity> query, 
     Expression<Func<TEntity, string>> selector, 
     IEnumerable<string> values) 
    { 
     if (selector == null) 
     { 
      throw new ArgumentNullException("selector"); 
     } 
     if (values == null) 
     { 
      throw new ArgumentNullException("values"); 
     } 
     if (!values.Any()) 
     { 
      return query; 
     } 
     var p = selector.Parameters.Single(); 
     var conditions = values.Select(v => 
      (Expression)Expression.Call(typeof(SqlMethods), "Like", null, 
       selector.Body, Expression.Constant("%" + v + "%"))); 
     var body = conditions.Aggregate((acc, c) => Expression.Or(acc, c)); 
     return query.Where(Expression.Lambda<Func<TEntity, bool>>(body, p)); 
    } 
} 

तो फिर तुम साथ इस कह सकते हैं QueryExtensions कक्षा के लिए आपको अपने नामस्थानों पर System.Linq.Expressions और System.Data.Linq.SqlClient नामस्थान जोड़ना होगा।

+0

यह काम किया! धन्यवाद! – Dusda

+0

मैंने लिंक से इकाइयों में कोड का उपयोग किया, और मुझे यह त्रुटि मिलती है: LINQ से Entities 'Boolean Like (System.String, System.String)' विधि को विधि नहीं पहचानती है, और इस विधि को स्टोर अभिव्यक्ति में अनुवादित नहीं किया जा सकता है। –

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