首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sitecore7 LinqHelper.CreateQuery Buggy?

Sitecore7 LinqHelper.CreateQuery Buggy?
EN

Stack Overflow用户
提问于 2014-06-16 05:04:58
回答 1查看 493关注 0票数 0

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

所以,

该方法有3个过载。这里讨论的2是: 1.LinqHelper.CreateQuery<SearchResultItem>(searchContext, searchStringModel) 2.LinqHelper.CreateQuery<SearchResultItem>(searchContext, searchStringModel, startLocationItem) I在这里没有使用任何额外的上下文,因此使用了默认null。

现在,

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

代码语言:javascript
复制
query = "location:{FOLDER_GUID};+custom:my_filed_name|bla_bla"

效果很好。但是(据我从方法签名中了解到),我还应该能够使用方法2,如下所示:

代码语言:javascript
复制
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();                
}

问题在于,对于上述方法(方法2),搜索工作正常,不起作用的是"startLocationItem“(本例中为folderID)。

例如,

如果在我的整个sitecore树中总共有3项包含"my_filed_name=bla_bla“

但是,只有一个项目在文件夹中包含"my_filed_name=bla_bla“({FOLDER_GUID},本例中是”perticular文件夹“)。

那么,

方法1返回1项(正确),方法2返回3项,尽管"startLocationItem = {FOLDER_GUID} .“(我认为不正确)

问题是:

1.方法1中"startLocationItem“的确切目的是什么?

2.使用"location“过滤器或"startLocationItem for method 2”有什么好处?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-16 08:04:58

LinqHelper是一个内部助手类,在正常操作中不应该使用。这是为了帮助Sitecore用户界面与搜索后端对话。它的语法可以在任何时候被更改,因此有可能破坏基于它的东西,而且它也没有被记录下来。

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

代码语言:javascript
复制
using (var context = index.CreateSearchContext)
{
    context.GetQueryable<SearchResultItem>().Where(x =>x.Paths.Contains(ID.Parse("your GUID Here")))
}

LinqHelper字符串中的“位置”相当于存储在索引中的路径(或_path)字段。

此字段包含作为GUID列表保存的项的所有父项的列表。

通过_path过滤,您可以将查询限制在树的某个节点上,而不影响得分,例如:

代码语言:javascript
复制
/home (id:1234) 
   /animals (id:5678 = path:1234 / 5678
       /cats (id:1111) = path: 1234 / 5678 / 1111
       /dogs (id:2222) = path: 1234 / 5678 / 2222 
   /cars (id:4567) = path: 1234 / 4567
       /sports (id:3333) = path: 1234 / 4567 / 3333

如果你过滤动物(即5678),你只限制搜索该项目及其子女。

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

代码语言:javascript
复制
using (var context = index.CreateSearchContext)
{
    context.GetQueryable<SearchResultItem>().Where(x =>Name.Contains("Exciting"))
           .Filter(y => y.Paths.Contains(ID.Parse("your GUID Here")
}

这将只在你过滤过的树中搜索名字包含“令人兴奋”的地方。

希望有帮助:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24236918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档