加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 过滤Kendo UI MVC Grid时的自定义谓词构建

发布时间:2020-12-16 09:53:45 所属栏目:asp.Net 来源:网络整理
导读:我正在使用带有服务器包装器的ASP.NET MVC的Kendo UI. IQueryable扩展方法ToDataSourceResult目前创建查询 myQuery.Where(x=x.SearchField.Contains(searchString)) 使用Contains运算符进行过滤时. 不幸的是我正在使用no-sql数据库RavenDb,它的linq提供程序
我正在使用带有服务器包装器的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));
    }

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

解决方法

有趣的问题.

我不认为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})",caseMod);
        break;

    ...

如果有效,请告诉我.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读