我试图创建一个ContainsAny和ContainsAll扩展,所以我可以基本上做到以下创建ContainsAny和ContainsAll扩展
string[] words = keywords.split(' ');
from c in comments
where c.Text.ContainsAny(words)
select c
到目前为止,我已经成功地做到以下几点:
我有这些两个扩展为AND和OR值为
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) {
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>(Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
}
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) {
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
}
,然后我有:
Expression<Func<Entities.Comment, bool>> predicate = c => false;
foreach (string word in query.Split(' ')) {
string w = word;
predicate = predicate.Or(c => c.Text.Contains(w));
}
q = q.Where(predicate);
现在,这一切工作正常,但我不知道如何将此功能提取到一个通用的扩展,然后我可以使用任何对象。
任何帮助将非常感激
感谢您的回答,但我不确定这会解决我的问题。我上面应该提到的是,我希望能够做到:从c中的注释中,c.text.containsAny(words)|| c.text.containsAll(words) – Gazeth 2011-05-25 12:23:59
我想这是可能的,但那肯定会更复杂。无论如何..使用上面的例子做的伎俩,只是不同的语法 – maxlego 2011-05-25 14:51:23