2016-02-05 78 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)