---
title: "結果タイプ投影の有効化および無効化"
slug: "enabling-and-disabling-result-type-projection"
abstract: ""
---
# 結果タイプ投影の有効化および無効化

Content Search LINQ APIは、Solr Query APIのflパラメータを用いて、Solrが検索結果で返すフィールドのリストを指定します。

> !注この機能( *結果タイプ投影*と呼ばれます)はデフォルトで有効ですが、無効にすることもできます。

このパラメータを使用すると、クエリ性能はいくつかの点で向上します:

-   Solrが検索結果を提供するために使用するリソースは削減されます。
-   Sitecoreが検索結果を処理するために使用するリソースは削減されます。
-   クエリの実行にかかる時間が短縮されます。

例えば、以下のコードがある場合:

public class SimpleResultItem
{
 IndexField("\_name")
 public string Name { get; set; }

 IndexField("\_uniqueid")
 public virtual ItemUri Uri { get; set; }

 IndexField("\_template")
 public virtual ID TemplateId { get; set; }
}

そして次のLINQクエリを実行します:

SimpleResultItem result = context.GetQueryable<SimpleResultItem>()
 .Where(i => i.Name == "home").ToArray();

検索ログで以下のSolrクエリに変換されていることがわかります:

q=\_name:(home) AND \_val\_:\_\_boost&fl=\_name,\_template,\_uniqueid,\_datasource&…

取得すべきフィールドのリストは、結果型で利用可能なプロパティに基づいて解決されました。これが *結果型投影*です。 \_uniqueidおよび \_datasourceフィールドはシステム使用上必要であり、常にリストに表示されます。

以下の例は、匿名型のSelect(…) メソッドを用いたクエリです:

var result = context.GetQueryable<SimpleResultItem>()
 .Where(i => i.Name == "home")
 .Select(i => new {i.Name}).ToArray();

Solrから取得するフィールドは3つだけです:

q=\_name:(home) AND \_val\_:\_\_boost&fl=\_name,\_uniqueid,\_datasource&…

検索と検索には別々のタイプを使うこともできます。これは、検索に豊富なプロパティを用意しつつ、リーンな検索結果を得るのに役立ちます。以下の例では、クエリは検索にデフォルトのSearchResultItemタイプを使い、結果の取得にはSimpleResultItemを使います。

SimpleResultItem result = context.GetQueryable<SearchResultItem>()
 .Where(i => i.Content == "sitecore")
 .Filter(i => i.Paths.Contains(contentItemId))
 .Cast<SimpleResultItem>().ToArray();

これは次の通りです:

q=\_content:(sitecore) AND val\_:\_\_boost&fq=\_path:(0de95ae441ab4d019eb067441b7c2450)&fl=\_name,\_template,\_uniqueid,\_datasource&…

SearchResultItem型には20以上のプロパティがありますが、プロバイダーはSimpleResultItem型のオブジェクトを埋めるのに十分な4つのフィールドのみを要求します。

## 結果型投影を無効化する

結果タイプの投影はデフォルトで有効です。ただし、過去のSitecoreバージョンとの後方互換性を維持するために無効にすることは可能です。結果タイプが以下のいずれかの条件を満たす場合、タイプ投影は無効になります:

-   型にはインデクサがあります
-   この型にはCollapsedIndexFieldAttribute属性でマークされたプロパティがあります
-   タイプ内のフィールド数は、Sitecore設定の「ContentSearch.Solr.MaxNumberOfFieldsToProject」設定で定義された上限に達します

クエリレベルでのプロジェクションを、適切なパラメータでResultTypeProjectionExecutionContext実行コンテキストをGetQueryableメソッドに渡すことで強制的に有効または無効化できます。

var disableProjection = ResultTypeProjectionExecutionContext.Switch(isEnable: false);

SimpleResultItem result = context.GetQueryable<SimpleResultItem>(disableProjection)
 .Where(i => i.Name == "home").ToArray();

Solrクエリにはflパラメータが含まれていません:

q=\_name:(home) AND \_val\_:\_\_boost&fq=\_indexname:(sitecore\_master\_index)&…