2010-01-06 49 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