Sitecore7 LinqHelper.CreateQuery是否存在错误?

Sitecore7 LinqHelper.CreateQuery是否存在错误?,linq,search,sitecore,sitecore7,Linq,Search,Sitecore,Sitecore7,这更像是一个澄清类型的问题,而不是关于LinqHelper.CreateQuery方法的实际问题 所以, 此方法有3个重载。这里讨论的两个问题是: 1.LinqHelper.CreateQuery(searchContext,searchStringModel) 2.LinqHelper.CreateQuery(searchContext、searchStringModel、startLocationItem)[我在这里没有使用任何其他上下文,所以使用了默认的null] 现在, 为了在内容树的特

这更像是一个澄清类型的问题,而不是关于
LinqHelper.CreateQuery
方法的实际问题

所以,
此方法有3个重载。这里讨论的两个问题是: 1.
LinqHelper.CreateQuery(searchContext,searchStringModel)
2.
LinqHelper.CreateQuery(searchContext、searchStringModel、startLocationItem)
[我在这里没有使用任何其他上下文,所以使用了默认的null]

现在,
为了在内容树的特定位置(例如,在您有1000个项目的特定文件夹下)搜索具有的项目,我可以使用方法1使用以下查询:

query = "location:{FOLDER_GUID};+custom:my_filed_name|bla_bla"
这很好用。 但是(我从方法签名中了解到的是)我也应该能够使用方法2,如下所示:

SitecoreIndexableItem folderID = SitecoreIndexableItem)contextDatabase.GetItem({FOLDER_GUID});
var index = ContentSearchManager.GetIndex(new SitecoreIndexableItem(Sitecore.Context.Item));
using (var context = index.CreateSearchContext())
{
    List<SearchStringModel> searchStringModel = new List<SearchStringModel>();
    searchStringModel.Add(new SearchStringModel("my_field_name", "bla_bla"));
    List<Sitecore.Data.Items.Item> resultItems = LinqHelper.CreateQuery(context, searchStringModel, folderID).Select(toItem => toItem.GetItem()).ToList();                
}
SitecoreIndexableItem folderID=SitecoreIndexableItem)contextDatabase.GetItem({FOLDER_GUID});
var index=ContentSearchManager.GetIndex(新的SitecoreIndexableItem(Sitecore.Context.Item));
使用(var context=index.CreateSearchContext())
{
List searchStringModel=新列表();
添加(新的searchStringModel(“我的字段名称”,“布拉布拉布拉”);
List resultItems=LinqHelper.CreateQuery(上下文、searchStringModel、folderID);
}
问题是,对于上述方法(方法2),搜索工作正常,不起作用的是“startLocationItem”(本例中为folderID)

例如,
如果在我的整个站点核心树中,共有3个项目包含“我的文件名=bla_bla”
但是,在文件夹({Folder_GUID},本例中为“特定文件夹”)中只有1项包含“my_field_name=bla_bla”
然后,
方法1返回1项(正确) 但是,方法2返回3项,尽管“startLocationItem={FOLDER\u GUID}…”(我认为这是不正确的)

问题是:
1.方法1中“startLocationItem”的确切目的是什么?

2.对于方法2,使用“位置”过滤器或“startLocationItem”有什么好处“?

LinqHelper是一个内部助手类,在正常操作中不应使用。这是为了帮助Sitecore UI与搜索后端对话。它的语法可以随时更改,因此可能会破坏基于它的东西,而且也没有文档记录

最好将查询转换为普通的Linq查询

using (var context = index.CreateSearchContext)
{
    context.GetQueryable<SearchResultItem>().Where(x =>x.Paths.Contains(ID.Parse("your GUID Here")))
}
如果你对动物(即5678)进行过滤,你只会限制搜索该项及其子项

使用筛选器意味着您可以限制搜索的上下文,而不影响主查询的评分,因此您将得到:

using (var context = index.CreateSearchContext)
{
    context.GetQueryable<SearchResultItem>().Where(x =>Name.Contains("Exciting"))
           .Filter(y => y.Paths.Contains(ID.Parse("your GUID Here")
}
使用(var context=index.CreateSearchContext)
{
context.GetQueryable()。其中(x=>Name.Contains(“令人兴奋”))
.Filter(y=>y.Paths.Contains(ID.Parse(“此处的GUID”)
}
这将只在您筛选的树的部分中搜索名称包含“令人兴奋”的部分


希望有帮助:)

谢谢Stephen,…这正是我想要的。非常有帮助。嗨Stephen,你关于在LinqHelper上使用LINQ-to-Sitecore的观点非常有价值。我还有一个问题:那就是我们还在使用LinqHelper.CreateQuery解析数据源查询吗?比如:var query=LinqHelper.CreateQuery(上下文,SearchStringModel.ExtractSearchQuery(queryString)).Select(toItem=>toItem.GetItem()).Take(10);我注意到这个方法是如何从Sitecore 7更改为Sitecore 7.2版本的。只是想知道什么是最佳实践?非常感谢。
using (var context = index.CreateSearchContext)
{
    context.GetQueryable<SearchResultItem>().Where(x =>Name.Contains("Exciting"))
           .Filter(y => y.Paths.Contains(ID.Parse("your GUID Here")
}