Bạn có thể cấu trúc lại một số bộ phận của mã bằng cách tạo một phương pháp mở rộng. Một cái gì đó như thế:
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);
}
}
Sau đó, bạn có thể sử dụng nó như thế:
var claims = db.Claims
.AppendTextFilter(c => c.companyFileID, ddlSearchField.Text, txtSearchBox.Text)
.AppendTextFilter(c => c.someOtherProperty, ddlOtherSearchField.Text, txtOtherSearchBox.Text)
...;
Nguồn
2009-10-12 20:21:32
Hi Thomas, giải pháp của bạn trông tuyệt vời và nó rất gần với những gì tôi đang tìm kiếm. Có an toàn để đặt var "claim" thành nguồn dữ liệu của GridView không? Tôi vừa thử và nhận được một thông báo lỗi. –
Xin lỗi, thông báo lỗi là: Phương thức 'System.Object DynamicInvoke (System.Object [])' không có bản dịch được hỗ trợ cho SQL. –
OK, tôi thấy sự cố ... LINQ to SQL không thể chuyển đổi cuộc gọi đại biểu thành biểu thức SQL, do đó, nó không thành công. Tôi sẽ cố gắng tìm một giải pháp và cập nhật câu trả lời của tôi –