C# Linq到Sql任意关键字搜索查询

C# Linq到Sql任意关键字搜索查询,c#,linq-to-sql,C#,Linq To Sql,我的应用程序中有一个案例,用户可以搜索术语列表。搜索需要按以下顺序进行三次传递: 一个是他们输入的内容的精确匹配。完成了,很简单 所有单词(单独)匹配的单词。完成了,也很容易 其中任何一个词都匹配…如何匹配 本质上,在Linq to Sql中,我如何告诉它这样做: select * from stuff s where s.Title like '%blah%' || s.Title like '%woo&' || s.Title like '%fghwgads%' || s.Tit

我的应用程序中有一个案例,用户可以搜索术语列表。搜索需要按以下顺序进行三次传递:

  • 一个是他们输入的内容的精确匹配。完成了,很简单
  • 所有单词(单独)匹配的单词。完成了,也很容易
  • 其中任何一个词都匹配…如何匹配
本质上,在Linq to Sql中,我如何告诉它这样做:

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

等等?

这可能是一个艰难的过程。。。我想你得自己写一个接线员

更新:是的,我测试了它,它工作正常。)


另外,您需要将
System.Linq.Expressions
System.Data.Linq.SqlClient
名称空间添加到
QueryExtensions
类的名称空间中。

您应该知道,这种事情最好通过全文搜索来处理。类似“%xyz%”的
版本将运行,但性能会很差。我在Linq to Entities中使用了该代码,但出现了以下错误:Linq to Entities无法识别方法“Boolean LIKE(System.String,System.String)”方法,并且无法将该方法转换为存储表达式。
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));
    }
}
string[] terms = new string[] { "blah", "woo", "fghwgads" };
var results = stuff.LikeAny(s => s.Title, terms);