私は、基本的に次のことを実行できるように、ContainsAny および ContainsAll 拡張機能を作成しようとしています。
string[] words = keywords.split(' ');
from c in comments
where c.Text.ContainsAny(words)
select c
これまでのところ、次のことを行うことができました。
ands と ors には、これらの 2 つの拡張機能があります。
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);
これですべて正常に動作しますが、この機能を汎用拡張機能に抽出して、任意のオブジェクトに対して使用できるようにする方法がわかりません。
どんな助けでも大歓迎です