您可以通過創建重構代碼的某些部分一種擴展方法。類似的東西:
static class QueryableExtensions
{
private static MethodInfo StringContainsMethod;
private static MethodInfo StringStartsWithMethod;
static QueryableExtensions()
{
Type[] singleStringParam = new[] {typeof(string)};
StringContainsMethod = typeof(string).GetMethod("Contains", singleStringParam);
StringStartsWithMethod = typeof(string).GetMethod("StartsWith", singleStringParam);
}
public static IQueryable<T> AppendTextFilter<T>(this IQueryable<T> queryable, Expression<Func<T, string>> memberSelector, string condition, string value)
{
Expression expression = null;
switch (condition)
{
case "StartsWith":
expression = Expression.Call(
memberSelector.Body,
StringStartsWithMethod,
Expression.Constant(value));
break;
case "Equals":
expression = Expression.Equal(
memberSelector.Body,
Expression.Constant(value));
break;
case "Contains":
expression = Expression.Call(
memberSelector.Body,
StringContainsMethod,
Expression.Constant(value));
break;
default:
throw new NotSupportedException(string.Format("'{0}' is not a supported condition", condition));
}
var lambda = Expression.Lambda<Func<T, bool>>(
expression,
memberSelector.Parameters);
return queryable.Where(lambda);
}
}
然後,您可以使用它像:
var claims = db.Claims
.AppendTextFilter(c => c.companyFileID, ddlSearchField.Text, txtSearchBox.Text)
.AppendTextFilter(c => c.someOtherProperty, ddlOtherSearchField.Text, txtOtherSearchBox.Text)
...;
喜托馬斯,您的解決方案看起來不錯,這是非常接近我所期待的。將「聲明」var設置爲gridview的數據源安全嗎?我剛剛嘗試過,並收到錯誤消息。 – 2009-10-12 21:14:33
對不起,該錯誤消息爲: 方法 'System.Object的DynamicInvoke(System.Object的[])' 無支持轉換爲SQL。 – 2009-10-12 21:25:37
好的,我看到了問題... Linq to SQL無法將委託調用轉換爲SQL表達式,因此失敗。我會盡力找到解決方案並更新我的答案 – 2009-10-12 22:22:02