2010-01-06 51 views
5

我的應用程序中有一個用戶可以搜索術語列表的案例。搜索需要按以下順序進行三次:Linq to Sql任何關鍵字搜索查詢

  • 一個用於輸入內容的完全匹配。完成,容易。
  • 所有單詞(單獨)匹配的單詞。完成,也很容易。
  • 其中任何的單詞匹配...怎麼樣?

從本質上講,我該如何,在LINQ to SQL中,告訴它要做到這一點:

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

等等?

+0

你應該知道,這種事情最好由全文搜索處理。 'LIKE'%xyz%''版本將運行,但性能會很糟糕。 – Aaronaught 2010-01-06 04:38:08

回答

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)); 
    } 
} 

然後,你可以用這個打電話您需要將System.Linq.ExpressionsSystem.Data.Linq.SqlClient命名空間添加到QueryExtensions類的命名空間中。

+0

工作正常!謝謝! – Dusda 2010-01-06 10:45:24

+0

我用Linq中的代碼實體,並且我得到這個錯誤:LINQ to Entities不能識別方法'布爾Like(System.String,System.String)'方法,並且此方法不能被轉換爲存儲表達式。 – 2015-11-11 21:12:04