我試圖創建一個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