在执行Linq to Sitecore查询时获取堆栈溢出

时间:2015-06-16 15:25:18

标签: linq sitecore sitecore7 sitecore7.5

我遇到了一个有趣的Linq to Sitecore问题。我有一个案例,我有一个人员目录和一个存储在Sitecore中的位置目录。我正在尝试编写一个搜索功能,可以让我搜索附近的人。为此添加皱纹是因为人们可以与多个位置相关联。

到目前为止,方法一直是寻找附近的地点,获取他们的身份,然后找到与这些地点相关联的所有人。

这看起来大致如下:

var locations = GetNearbyLocations(lat, long, radius) // returns a list of short ID's 

var searchPredicate = PredicateBuilder.True<SearchResultItem>();
var locationsPredicate = PredicateBuilder.False<SearchResultItem>();

foreach (var location in locations)
{
    locationPredicate = locationPredicate.Or(x => x["location"] == location);
}

searchPredicate = searchPredicate.And(locationPredicate);
searchPredicate = searchPredicate.And(sri => sri.TemplateId == personTemplateId);

using (var context = index.CreateSearchContext())
{
    var peopleReults = context.GetQueryable<SearchResultItem>.Where(locationPredicate).GetResults();
}

如果GetNearbyLocations返回相对较小的位置集,则上述效果很好。一旦我们超过150左右,对GetQuerable的调用将导致堆栈溢出。

2 个答案:

答案 0 :(得分:0)

您可以使用locations数组并执行包含。

]

如果你从那个Ill帖子中得到一个很大的错误,你可以使用一些lambda表达式。

答案 1 :(得分:0)

Lucene一次只能处理1024个子句。

有一个名为 ContentSearch.LuceneQueryClauseCount 的Sitecore设置,它应该强制Lucene接受您在设置中定义的任何数量的子句,但它似乎不起作用。在搜索操作期间,更改此设置的值似乎没有任何作用。有一种方法可以强制读取此设置,并强制Lucene一次接受超过1024个OR子句。增加此设置的值,在执行搜索之前,请运行以下代码行:

BooleanQuery.MaxClauseCount = int.Parse(Sitecore.Configuration.Settings.GetSetting("ContentSearch.LuceneQueryClauseCount"));

这允许您提交超过1024个子句的查询,但是,在某些时候,Lucene仍然会抛出StackOverflowException。要解决Lucene限制,您必须以1024的增量分解OR子句的数量,并且每次都使用OR子句的子集执行多次搜索。