过滤Kendo UI MVC Grid时自定义谓词构建

时间:2013-12-26 17:47:54

标签: asp.net-mvc linq kendo-ui ravendb kendo-grid

我正在使用带有服务器包装器的ASP.NET MVC的Kendo UI。

IQueryable扩展方法ToDataSourceResult目前创建类似

的查询
 myQuery.Where(x=>x.SearchField.Contains(searchString))

使用Contains运算符进行过滤。

不幸的是我正在使用no-sql数据库RavenDb及其linq提供程序不支持contains方法。相反,它为IQueryable提供了名为Search的扩展。 因此,在进行全文搜索时,我应该写

 myQuery.Search(x=>x.SearchField, searchString)

而是Where子句。这就是为什么我很好奇有没有机会覆盖默认谓词构建器? 现在我正在这样做(这是非常基本的实现):

   public static IQueryable<TEntity> ApplyFiltering<TEntity>(this IQueryable<TEntity> queryable, IList<IFilterDescriptor> filters) where TEntity:class
    {
        foreach (var filter in filters.Cast<FilterDescriptor>()){

            var pe = Expression.Parameter(typeof(TEntity), "x");
            var left = Expression.Property(pe, typeof(TEntity).GetProperty(filter.Member));
            queryable = queryable.Search(Expression.Lambda<Func<TEntity, object>>(left, new ParameterExpression[] { pe }), filter.Value.ToString());
        }
        filters.Clear();

        return queryable;
    }

//And controller code:

    public ActionResult Data_Read([DataSourceRequest] DataSourceRequest request)
    {
            var query = repository.GetQueryable();
            query = query.ApplyFilters(request.Filters);
            return Json(query.ToDataSourceResult(request));
    }

这是正确的解决方法吗?或者有更明显的解决方案,我在文档中找不到?

1 个答案:

答案 0 :(得分:3)

有趣的问题。

我认为Kendo MVC Wrappers中没有任何可插入功能可以改变这一点。 您可以查看源代码:Kendo.Mvc.Extensions.FilterTokenExtensions并可能更改此内容。

但是你也可以在github上修改我的项目:KendoGridBinderEx,看看文件 FilterObject.cs

更改代码:

switch (op)
{
    ...

    case "contains":
        exStr = string.Format("{0}{2}.Contains({1})", field, param, caseMod);
        break;

    ...

switch (op)
{
    ...

    case "contains":
        exStr = string.Format("{0}{2}.Search({1})", field, param, caseMod);
        break;

    ...

如果有效,请告诉我。