首页 > 解决方案 > 角度剑道网格自定义过滤器不适用于具有集合属性的对象

问题描述

我想对作为对象集合的列进行过滤。

我使用 kendo-grid 来显示 Product 对象:

public class Product
{        
    public string Id{ get; set; }
    public string Title{ get; set; }        
    public ObservableCollection<Tag> Tags { get; set; }        
}
public class Tag
{        
    public string Id{ get; set; }
    public string Title{ get; set; }                            
}

我想按标签过滤网格,所以我在打字稿中为剑道网格编写了自定义过滤器

  private tagFilter: any[] = [];


  public tagChange(values: any[], filterService: FilterService): void {
filterService.filter({
  filters: values.map(value => ({
    field: "tags.id",
    operator: "eq",
    value
  })),
  logic: "or"
});}

  public tagFilters(filter: CompositeFilterDescriptor): FilterDescriptor[] {
this.tagFilter.splice(
  0, this.tagFilter.length,
  ...flatten(filter).map(({ value }) => value)
);
return this.tagFilter;  }

const flatten = filter => { const filters = (filter || {}).filters;  if (filters) {
return filters.reduce((acc, curr) => acc.concat(curr.filters ? flatten(curr) : [curr]), []); } return [];};

和 HTML 代码是

  <kendo-grid-column field="tags.id" title="Tag" width="150">
<ng-template kendoGridFilterMenuTemplate let-column="column" let-filter="filter" let-filterService="filterService">
  <kendo-multiselect style="width:220px"
                     [data]="allTags"
                     textField="title"
                     valueField="id"
                     [valuePrimitive]="true"
                     [value]="tagFilters(filter)"
                     (valueChange)="tagChange($event, filterService)">
  </kendo-multiselect>
</ng-template>

后端代码是 C# 并且搜索服务是

public virtual DataSourceResult SearchKendo(DataSourceRequest criteria)
    {
        using (var repository = _repositoryFactory())
        {
            return repository.Products.Include("Tags").ToDataSourceResult(criteria.Take, criteria.Skip, criteria.Sort, criteria.Filter);
        }
    }

但在运行时我得到这个错误

System.Linq.Dynamic.Core.Exceptions.ParseException: 'No property or field 'id' exists in type 'ObservableCollection`1''

似乎“标签”不被称为对象的集合,实际上它被认为是一个对象

标签: c#angularkendo-grid

解决方案


推荐阅读