2016-02-05 36 views
2

使用EPiServer查找并尝试为其构建通用构面funcionality,以简化管理应启用哪个构面。我想构建两种通用方法,一种是添加有效过滤器来执行匹配搜索,另一种是执行剩余的可用面过滤器。使用通用属性名称处理lambda表达式

第一种方法将执行以下(品牌过滤特定代码):

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; 

是否有可能建立这种功能?我最大的问号是如何“品牌”输入字符串翻译是品牌属性,X => x.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); 
} 

的。或者方法采用

System.Linq.Expressions.Expression<Func<T, Find.Api.Querying.Filter>> 

所以也许东西可以用来做一个适当的通用调用它

回答

0

绝对有可能创建通用的lambda表达式,这只是不容易,需要大量的反射代码。

我还没有完成它,但也许如果你看看我为前段时间类似的东西创建的代码(通用lambda表达式),它会有所帮助。我相信有更新鲜经验的人会尽快帮助你。

Decimal precision attribute < - 看看一个这个答案女巫代码从一个属性的一类自动genereate modelBuilder.Entity<CLASS>().Property(OBJECT=> OBJECT.PROPERTY).HasPrecision(12, 10)