【问题标题】:Sitecore Content Search PredicateBuilder vs IEnumerableSitecore 内容搜索 PredicateBuilder 与 IEnumerable
【发布时间】:2014-10-09 12:50:05
【问题描述】:

我在查询 IEnumerable 计算索引字段时遇到问题。我正在使用 Sitecore 7.2 upd2、Lucene、ContentSearch 和 PredicateBuilder。

我正在尝试查询产品部分下的产品价格。有一些沉重的逻辑来查找可用的产品,所以我决定将所有可用的产品价格放在计算字段中。不幸的是,我似乎无法使用 PredicateBuilder 查询价格表。

我的查询如下所示:

predicate = predicate.And(p => p.Prices.Any(x => x >= priceFrom && x <= priceTo));

索引配置中的字段配置:

<field fieldName="Prices"  storageType="YES" indexType="TOKENIZED"    vectorType="NO" boost="1f" type="System.Collections.Generic.IEnumerable`1[System.Int32]" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" />

这是我的错误:

Invalid Method Call Argument Type: Field - FieldNode - Field: prices -     System.Collections.Generic.IEnumerable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]. Only constant arguments is supported.

有什么想法吗?

【问题讨论】:

    标签: lucene sitecore predicatebuilder sitecore7.2 computed-field


    【解决方案1】:

    错误源于Any() 方法调用的参数。

    Sitecore 内容搜索 LINQ 有一些限制。其中之一是方法只接受“常量表达式”(对象)作为参数。您将“lamda 表达式”作为 Any 方法的参数传递。

    【讨论】:

    • 是的,似乎是这样,我也在尝试普通的 .Count() - 没有运气。所以看起来我真的不能在这里对 IEnumerable 做任何简单的操作。
    • 嗯.. 可能是对 Any() 的实际调用,而不是我所说的 Lambda。
    【解决方案2】:

    我建议将每个产品的最低和最高价格作为索引中单独的计算字段(十进制)进行索引。

    这将大大简化您的查询:

    var results = context.GetQueryable<ProductSearchResultItem>
        .Where(p => p.MinPrice >= myPrice)
        .Where(p => p.MaxPrice <= myPrice)
        .GetResults();
    

    【讨论】:

    • 那是我最初的计划:) 但当部分中的产品价格为 {100,200,300} 并且您正在寻找介于 225 和 250 之间的价格时,它会失败。在这种情况下,搜索不应返回此部分。但如果我只使用最高 (300) 和最低 (100) 价格进行比较,就会出现这种情况。无论如何,谢谢!
    • 您的价格如何存储并与 Sitecore 中的产品关联?您是在电子商务模块中使用 PriceMatrix 字段,还是它们是您与产品相关联的单独项目等?
    猜你喜欢
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多