代码之家  ›  专栏  ›  技术社区  ›  Dusda

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

  •  5
  • Dusda  · 技术社区  · 16 年前

    • 一个是他们输入的内容的精确匹配。完成了,很简单。
    • 一个地方

    本质上,在Linq to Sql中,我如何告诉它这样做:

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

    1 回复  |  直到 16 年前
        1
  •  7
  •   Aaronaught    16 年前

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

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

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

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