Where()不使用“-12345”等字符串,但使用“12345”

时间:2017-08-29 22:27:18

标签: c# linq sitecore8

我有一个来自Sitecore 8.1.3项目的代码块,使用LINQ过滤基于SOLR索引的IQueryable集合。我们正在尝试根据用户选择的城市过滤一系列酒店。

从索引填充HotelSearchResultItem.HotelCity属性,它是一个字符串。它的值不是实际的城市名称,而是城市名称的HashCode的字符串表示...如“12345”或“-12345”,具体取决于HashCode的int值。这是索引的内容,所以我们坚持使用这种格式。

_facet变量是用户选择的城市名称,您会看到对其执行类似操作以将其转换为“12345”HashCode / String格式。

var index = ContentSearchManager.GetIndex("myIndex");
using (var context = index.CreateSearchContext())
{
    var hotels = context.GetQueryable<HotelSearchResultItem>()
        .Where( item => item.TemplateId == new ID(TemplateIDs.Hotels.Hotel) );

    var city = _facet
        .GetHashCode()
        .ToString( CultureInfo.InvariantCulture );

    hotels = hotels
        .Where( item => item.HotelCity == city );

  //more omitted
}

如果HotelCity和city的值为“12345”,那么Where子句会过滤掉。但是,如果值为负值,如“-12345”,则在已知匹配的情况下,生成的集合为空。我可以在单步执行时看到调试器中的匹配字符串。没有前导或尾随空格或其他字符。此外,使用==运算符将此代码重构为foreach循环会产生预期的匹配,这就是我解决此问题的方法。

为什么LINQ不匹配“否定”字符串?有什么见解吗?感谢。

1 个答案:

答案 0 :(得分:2)

在Solr管理面板中调试我的查询并阅读SOLR文档中的LuceneQParser后,我发现原因是消极的&#39; facet的值不起作用(即:&#34; -12345&#34;):

来自文档:&#34; [破折号]禁止使用以下术语(即不包含该术语的字段或文档的匹配项)。 - 运算符在功能上类似于布尔运算符!由于Google等热门搜索引擎使用了它,因此某些用户社区可能会更为熟悉。&#34;

请参阅此处的文档,有关布尔运算符的部分:https://cwiki.apache.org/confluence/display/solr/The+Standard+Query+Parser

在SOLR查询中使用反斜杠转义-得到了正确的结果。