处理具有泛型属性名称的 lambda 表达式
本文关键字:lambda 表达式 属性 泛型 处理 | 更新日期: 2023-09-27 18:33:30
使用 EPiServer Find 并尝试为其构建通用分面功能,以简化应启用哪个分面的管理。我想构造两个通用方法,一个用于添加活动过滤器以执行命中搜索,另一个用于执行剩余的可用分面过滤器。
第一种方法将执行以下操作(品牌过滤器的特定代码(:
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>>
所以也许可以使用一些东西来对它进行适当的通用调用
创建通用 lambda 表达式绝对是可能的,只是不容易,需要大量的反射代码。
我已经有一段时间没有这样做了,但也许如果你看看我不久前为类似的东西(通用 lambda 表达式(创建的代码,它会有所帮助。我相信有经验的人很快就会在这里帮助你。
十进制精度属性 <-- 看看这个答案女巫有代码从类中的属性自动生成modelBuilder.Entity<CLASS>().Property(OBJECT=> OBJECT.PROPERTY).HasPrecision(12, 10)