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 番目の質問) はまだ興味があります。
読んでくれてありがとう、スティーブ