我正在使用带有服务器包装的ASP.NET MVC Kendo UI。
IQueryable扩展方法ToDataSourceResult当前创建查询,例如
myQuery.Where(x=>x.SearchField.Contains(searchString))
当使用包含运算符进行过滤时。
不幸的是,我使用的是非SQL数据库RavenDb,它的linq提供程序不支持contains方法。相反,它为IQueryable提供了扩展,称为搜索。所以当进行全文搜索时,我应该写
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})", field, param, caseMod);
break;
...
请让我知道这是否有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句