3

MultilistField の TargetID など、Sitecore ID の配列がある場合、ContentSearchManager にクエリを実行してすべての SearchResultItem オブジェクトを返すにはどうすればよいですか?

「定数引数のみがサポートされています」という次のことを試しました。エラー。

using (var s = Sitecore.ContentSearch.ContentSearchManager.GetIndex("sitecore_master_index").CreateSearchContext())
{
    rpt.DataSource = s.GetQueryable<SearchResultItem>().Where(x => f.TargetIDs.Contains(x.ItemId));
    rpt.DataBind();
}

複数の OR クエリを使用して、Linq クエリを手動で作成できると思います。Sitecore.ContentSearch.Utilities.LinqHelperクエリを作成するために使用できる方法はありますか?

この手法が機能すると仮定すると、たとえば 10 個のアイテムだけに使用する価値はありますか? 最初の Sitecore 7 プロジェクトを開始したばかりで、できるだけインデックスを使用したいと考えています。

最後に、ページ エディターは SearchResultItem をソースとしてフィールドの編集をサポートしていますか?

更新 1 dunston が示唆するように、述語ビルダーを利用するこの関数を作成しました。これが実際に (アイテムの代わりに) 使用する価値があるかどうかはまだわかりません。

public static List<T> GetSearchResultItemsByIDs<T>(ID[] ids, bool mustHaveUrl = true)
    where T : Sitecore.ContentSearch.SearchTypes.SearchResultItem, new()
{
    Assert.IsNotNull(ids, "ids");
    if (!ids.Any())
    {
        return new List<T>();
    }

    using (var s = Sitecore.ContentSearch.ContentSearchManager.GetIndex("sitecore_master_index").CreateSearchContext())
    {
        var predicate = PredicateBuilder.True<T>();
        predicate = ids.Aggregate(predicate, (current, id) => current.Or(p => p.ItemId == id));

        var results = s.GetQueryable<T>().Where(predicate).ToDictionary(x => x.ItemId);
        var query = from id in ids
                  let item = results.ContainsKey(id) ? results[id] : null
                  where item != null && (!mustHaveUrl || item.Url != null)
                  select item;

        return query.ToList();
    }
}

結果が IDs 配列で提供されたものと同じ順序になるように強制します。これは私の場合は重要です。(誰かがこれを行うより良い方法を知っているなら、知りたいです)。

また、デフォルトでは、Item に URL があることが保証されます。

私のメインコードは次のようになります。

var f = (Sitecore.Data.Fields.MultilistField) rootItem.Fields["Main navigation links"];
rpt.DataSource = ContentSearchHelper.GetSearchResultItemsByIDs<SearchResultItem>(f.TargetIDs);
rpt.DataBind();

ページ エディターが一般的に SearchResultItem または POCO にどのように対処するか (私の 2 番目の質問) はまだ興味があります。

読んでくれてありがとう、スティーブ

4

1 に答える 1