gpt4 book ai didi

c# - 使用通用属性名称处理 lambda 表达式

转载 作者:太空宇宙 更新时间:2023-11-03 15:26:04 24 4
gpt4 key购买 nike

使用 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);
}

.Or 方法需要一个

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

所以也许可以使用某些东西来对它进行适当的通用调用

最佳答案

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

我有一段时间没有这样做了,但如果您看看我刚才为类似的东西创建的代码(通用 lambda 表达式),也许它会有所帮助。我相信经验丰富的人会尽快帮助您。

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

关于c# - 使用通用属性名称处理 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35222557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com