我正在使用EPiServer Find,并尝试为其构建通用的Facet功能,以简化管理应启用哪些Facet。我想构建两个通用方法,一个用于添加活动过滤器以执行命中搜索,另一个用于执行剩余可用Facet过滤器。
第一个方法将执行以下操作(品牌过滤器的特定代码):
var brandFilter = client.BuildFilter<FashionProduct>();
foreach (var facet in SelectedGroup.Facets.Where(x => x.Selected))
{
brandFilter = brandFilter.Or(x => x.Brand.Match(facet.Key));
}
query = query.Filter(brandFilter);
我希望能以通用的方式调用它,这样我就可以基于一些简单的字符串或对象列表来确定可用的外观。就像这样:
query = AddFilterFacet<FashionProduct>(query, "Brand", SelectedGroup.Facets)
因此,该方法将采用要过滤的对象类型、要附加筛选器的查询、要筛选的属性名称和要添加的值列表。
第二种方法类似,但更与执行以下内容相关:
facetQuery = facetQuery.TermsFacetFor(x => x.Brand)
...
var brandFacets = facetResult.TermsFacetFor(x => x.Brand).Terms;
是否有可能构建这种功能?我最大的疑问是如何将“Brand”输入字符串转换为x=>x.Brand中的Brand属性。
private void AddFilterFacet<T>(IClient client, ref ITypeSearch<T> query, string propertyName, List<FacetOption> facets)
{
var filter = client.BuildFilter<T>();
foreach (var facet in facets)
{
filter = filter.Or(x => x.????.Match(facet.Key));
}
query = query.Filter(filter);
}
.Or 方法需要一个参数。
System.Linq.Expressions.Expression<Func<T, Find.Api.Querying.Filter>>
也许可以使用某些方法来进行适当的通用调用