我的应用程序中有一个案例,用户可以搜索术语列表。搜索需要按以下顺序进行三遍:
- 与他们输入的内容完全匹配的一个。完成,简单。
- 所有单词(单独)匹配的一种。完成了,也很简单。
- 一处any单词匹配...如何?
本质上,我如何在 Linq to 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);
附:您需要添加System.Linq.Expressions
and System.Data.Linq.SqlClient
命名空间到您的命名空间QueryExtensions
class.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)