jqgrid with asp.net webmethod and json working with sorting, paging, searching and LINQ -- but needs dynamic operators
Consider this extension method, that converts a string into a MemberExpression:
public static class StringExtensions{ public static MemberExpression ToMemberExpression(this string source, ParameterExpression p) { if (p == null) throw new ArgumentNullException("p"); string[] properties = source.Split('.'); Expression expression = p; Type type = p.Type; foreach (var prop in properties) { var property = type.GetProperty(prop); if (property == null) throw new ArgumentException("Invalid expression", "source"); expression = Expression.MakeMemberAccess(expression, property); type = property.PropertyType; } return (MemberExpression)expression; }}
The method below converts the strings that you have into an Lambda Expression, that you can use to filter a Linq query. It is a generic method, with T as the domain entity.
public virtual Expression<Func<T, bool>> CreateExpression<T>(string searchField, string searchString, string searchOper) { Expression exp = null; var p = Expression.Parameter(typeof(T), "p"); try { Expression propertyAccess = searchField.ToExpression(p); switch (searchOper) { case "bw": exp = Expression.Call(propertyAccess, typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) }), Expression.Constant(searchString)); break; case "cn": exp = Expression.Call(propertyAccess, typeof(string).GetMethod("Contains", new Type[] { typeof(string) }), Expression.Constant(searchString)); break; case "ew": exp = Expression.Call(propertyAccess, typeof(string).GetMethod("EndsWith", new Type[] { typeof(string) }), Expression.Constant(searchString)); break; case "gt": exp = Expression.GreaterThan(propertyAccess, Expression.Constant(searchString, propertyAccess.Type)); break; case "ge": exp = Expression.GreaterThanOrEqual(propertyAccess, Expression.Constant(searchString, propertyAccess.Type)); break; case "lt": exp = Expression.LessThan(propertyAccess, Expression.Constant(searchString, propertyAccess.Type)); break; case "le": exp = Expression.LessThanOrEqual(propertyAccess, Expression.Constant(searchString, propertyAccess.Type)); break; case "eq": exp = Expression.Equal(propertyAccess, Expression.Constant(searchString.ToType(propertyAccess.Type), propertyAccess.Type)); break; case "ne": exp = Expression.NotEqual(propertyAccess, Expression.Constant(searchString, propertyAccess.Type)); break; default: return null; } return (Expression<Func<T, bool>>)Expression.Lambda(exp, p); } catch { return null; } }
So, you can use it like this:
db.TBL_USERs.Where(CreateExpression<TBL_USER>("LAST_NAME", "Costa", "eq"));
Give this article a peep. It is focused on using jqgrid in MVC but you can extract the relevant information.