У меня есть случай в моем приложении, где пользователь может искать список терминов. Поиск должен сделать три передачи в следующем порядке:
По существу, как делают меня, в Linq к Sql, говорят этому делать это:
select * from stuff s where s.Title like '%blah%' || s.Title like '%woo&' || s.Title like '%fghwgads%' || s.Title like...
И так далее?
Это может быть трудно... Думаю, вам придется написать свой собственный оператор.
(Update: Да, я его тестировал, он работает.)
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
.