Linq to Sql любой запрос по ключевому слову - PullRequest
5 голосов
/ 06 января 2010

В моем приложении есть случай, когда пользователь может искать список терминов. Для поиска необходимо выполнить три прохода в следующем порядке:

  • Один за точное совпадение того, что они ввели. Готово, просто.
  • Тот, где все слова (индивидуально) совпадают. Готово, тоже просто.
  • Тот, где любое слов совпадает ... как?

По сути, как мне, в Linq to Sql, сказать это, чтобы сделать это:

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

И так далее?

1 Ответ

7 голосов
/ 06 января 2010

Это может быть непросто ... Я думаю, вам придется написать свой собственный оператор.

( Обновление: Да, я проверял, все работает.)

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.Expressions и System.Data.Linq.SqlClient в свои пространства имен для класса QueryExtensions.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...