2014-06-16 30 views
0

这是更多的澄清类型问题,而不是关于LinqHelper.CreateQuery方法的实际问题。Sitecore7 LinqHelper.CreateQuery Buggy?

因此,
该方法有3个重载。在这里讨论的2,分别是:1。 LinqHelper.CreateQuery<SearchResultItem>(searchContext, searchStringModel) 2. LinqHelper.CreateQuery<SearchResultItem>(searchContext, searchStringModel, startLocationItem) [我没有使用任何其他上下文这里,所以使用了默认空]

现在,
为了在与特定搜索项目内容树的位置(例如一个特定的文件夹下有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();     
} 

问题是上述方法(方法2)搜索工作正常,什么不起作用的是“startLocationItem”(在这种情况下为folderID)。

例如
IF在我的整个Sitecore的树具有包含共3项 “my_filed_name = bla_bla”
BUT,仅1项包含在文件夹({FOLDER_GUID} “my_filed_name = bla_bla”, “所述特定的文件夹” 在这种情况下)
THEN,
方法1返回1项(这是正确的) BUT,方法2返回3项,尽管“startLocationItem = {FOLDER_GUID} ...(这我不认为是正确的)

问题是:
1.方法1中“startLocationItem”的确切用途是什么?
2.使用“位置”过滤器或“方法2的startLocationItem”有什么好处?

回答

1

LinqHelper是内部帮手类,不应该在正常操作中使用。它可以帮助Sitecore用户界面与搜索后台进行对话。它的语法可以在任何时候改变,因此可能会破坏基于它的东西,而且它也没有记录。

你会更好地查询转换成普通Linq查询即

using (var context = index.CreateSearchContext) 
{ 
    context.GetQueryable<SearchResultItem>().Where(x =>x.Paths.Contains(ID.Parse("your GUID Here"))) 
} 

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

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

通过由_path过滤你限制查询到树的某个节点,而不影响分数,例如:

/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)您限制只搜索该项目和它的孩子。

使用过滤装置可以限制没有这部分影响主查询的得分搜索的情况下,所以你最终会得到:

using (var context = index.CreateSearchContext) 
{ 
    context.GetQueryable<SearchResultItem>().Where(x =>Name.Contains("Exciting")) 
      .Filter(y => y.Paths.Contains(ID.Parse("your GUID Here") 
} 

这将只搜索的部分内你已经过滤的名称包含'精彩'的树。

希望可以帮到:)

+0

谢谢Stephen,...正是我在找的东西。很有帮助。 –

+0

您好斯蒂芬,您在LinqHelper上使用LINQ到Sitecore的观点非常有价值。 我还有一个问题: 这是我们仍然使用LinqHelper.CreateQuery解析数据源查询?像这样: var query = LinqHelper.CreateQuery(context,SearchStringModel.ExtractSearchQuery(queryString)).Select(toItem => toItem.GetItem())。 我注意到这个方法已经从Sitecore 7变成了sitecore 7.2 rev。只是想知道最佳做法是什么? 非常感谢提前。 –