Linq to Sql任何关键字搜索查询

时间:2010-01-06 02:41:47

标签: 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.Title like...

等等?

1 个答案:

答案 0 :(得分:7)

这可能很难......我认为你必须自己编写运算符。

更新:是的,我测试了它,它有效。)

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

P.S。您需要将System.Linq.ExpressionsSystem.Data.Linq.SqlClient命名空间添加到QueryExtensions类的命名空间中。