如何在Kendo Grid中按字符串值筛选整数字段?
解决Kendo Grid整数字段按字符串筛选的异常问题
问题原因
你遇到的异常是因为Kendo的ToDataSourceResult方法会自动将字符串筛选条件(比如包含"5")直接应用到long类型的TrackNumber字段上,尝试调用字符串的ToLower()方法,但整数类型没有这个方法,导致类型不匹配错误。
可行解决方案
方案一:后端手动转换筛选条件
在调用ToDataSourceResult之前,手动处理筛选器,将针对TrackNumber的字符串包含筛选转换为整数转字符串后的匹配逻辑。示例代码如下:
var request = DataSourceRequestModel.FromHttpContext(Request); var query = _dbContext.BatchDetails.AsQueryable(); // 处理TrackNumber的字符串筛选 foreach (var filter in request.Filters.OfType<FilterDescriptor>()) { if (filter.Member == nameof(BatchDetail.TrackNumber) && filter.Operator == FilterOperator.Contains) { var searchValue = filter.Value.ToString(); // 替换原筛选条件,用整数转字符串后的Contains逻辑 query = query.Where(b => b.TrackNumber.ToString().Contains(searchValue)); // 移除原筛选器,避免ToDataSourceResult再处理 request.Filters.Remove(filter); break; } } var result = query.ToDataSourceResult(request); return Json(result);
方案二:使用DTO映射字符串字段
创建一个包含字符串类型对应字段的DTO,将TrackNumber转换为字符串后供Grid筛选使用:
public class BatchDetailDto { public long TrackNumber { get; set; } public string TrackNumberStr => TrackNumber.ToString(); } // 查询时转换为DTO var query = _dbContext.BatchDetails.Select(b => new BatchDetailDto { TrackNumber = b.TrackNumber }).AsQueryable(); // Grid绑定BatchDetailDto,筛选时用TrackNumberStr字段 var result = query.ToDataSourceResult(request); return Json(result);
方案三:利用EF函数处理字符串转换(适用于Entity Framework)
如果使用EF,可以借助框架内置函数实现数据库层面的字符串匹配:
EF Core示例:
var searchValue = "5"; var query = _dbContext.BatchDetails .Where(b => EF.Functions.ToString(b.TrackNumber).Contains(searchValue)); var result = query.ToDataSourceResult(request);
EF6示例:
var searchValue = "5"; var query = _dbContext.BatchDetails .Where(b => SqlFunctions.StringConvert((double)b.TrackNumber).Contains(searchValue)); var result = query.ToDataSourceResult(request);
内容的提问来源于stack exchange,提问作者Hadi Jahangiri
相关产品推荐
相关产品推荐

