Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行Linq到Sitecore查询时获取堆栈溢出_Linq_Sitecore_Sitecore7_Sitecore7.5 - Fatal编程技术网

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

执行Linq到Sitecore查询时获取堆栈溢出,linq,sitecore,sitecore7,sitecore7.5,Linq,Sitecore,Sitecore7,Sitecore7.5,我遇到了一个有趣的Linq到Sitecore的问题。在这种情况下,我有一个人员目录和一个位置目录,它们都存储在Sitecore中。我正在尝试编写一个搜索函数,允许我搜索附近的人。事实上,人们可以与多个地点联系在一起,这给这一点增加了一点麻烦 到目前为止,方法是找到附近的地点,获取他们的id,然后找到所有与这些地点有关联的人 这大致如下: var locations=GetNearbyLocations(lat、long、radius)//返回短ID的列表 var searchPredicate=

我遇到了一个有趣的Linq到Sitecore的问题。在这种情况下,我有一个人员目录和一个位置目录,它们都存储在Sitecore中。我正在尝试编写一个搜索函数,允许我搜索附近的人。事实上,人们可以与多个地点联系在一起,这给这一点增加了一点麻烦

到目前为止,方法是找到附近的地点,获取他们的id,然后找到所有与这些地点有关联的人

这大致如下:

var locations=GetNearbyLocations(lat、long、radius)//返回短ID的列表
var searchPredicate=PredicateBuilder.True();
var locationsPredicate=PredicateBuilder.False();
foreach(位置中的var位置)
{
locationPredicate=locationPredicate.Or(x=>x[“位置”]==location);
}
searchPredicate=searchPredicate.And(locationPredicate);
searchPredicate=searchPredicate.And(sri=>sri.TemplateId==personTemplateId);
使用(var context=index.CreateSearchContext())
{
var peopleReults=context.GetQueryable.Where(locationPredicate.GetResults();
}

如果
GetNearbyLocations
返回相对较小的位置集,则上述方法非常有效。一旦超过150个左右,调用
getqueryable
将导致堆栈溢出。

您可能可以使用位置数组并执行包含操作

locationPredicate.And(x=>locations.Contains(x[“location”]);

如果你从中得到一个很大的错误,我将发布一些lambda表达式,你可以使用它们。

Lucene一次只能处理1024个子句

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

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

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

您能发布您收到的错误消息吗?这是一个标准的System.StackOverflowException错误。您能发布完整的错误堆栈吗?仍然会出现堆栈溢出。我开始认为我正在设置表达式树限制:。可能需要重新审视你正在处理的横向索引的体系结构也许值得考虑进行空间搜索后端索引是Coveo:(嗯,对不起,我对Coveo了解不多,我觉得它像Sitecore 7 search linq。@ddysart Sitecore 7.5引入了对多个搜索提供程序的支持,因此您可以仅为您的人员/位置创建一个新的Lucene索引(限制索引
)这应该允许你对Lucene索引使用空间搜索模块。是的,我怀疑是这样的。我们在架构上回到了绘图板上,因为我认为我们不会绕过这个问题。谢谢!通常当你点击MaxClauseCount时,会抛出一个
Toomanycauses
异常,这就是为什么我会询问抛出的错误消息。在任何情况下,请参阅我关于为这些项使用单独Lucene索引的建议,或尝试将其移动到SQL Server中: