---
title: "xConnect検索に対応している方法と演算子"
slug: "supported-methods-and-operators-for-xconnect-search"
abstract: "xConnect Client APIを使って連絡先ややり取りを検索する際のサポート方法とサポートされていない方法とオペレーターの概要。"
---
# xConnect検索に対応している方法と演算子

xConnect searchはIAsyncQueryable<T> すべてを実装しているわけではなく、サポートされていない方法を使おうとするとSitecore.XConnect.Search.YourLinqIsTooStrongException例外が出されます。以下のリストは、明示的に記載されていない限り、接触検索とインタラクション検索の両方に適用されます。

同期および非同期拡張メソッドの概要については [、xConnect Client API](https://doc.sitecore.com/xp/ja/developers/91/sitecore-experience-platform/xconnect-client-api-overview.html "xConnect Client API overview")を参照してください。

## サポート

以下の拡張メソッドがサポートされています:

-   .Where()
-   .Any() (シンプル - 制限については「Azure Search: リストフィールド制限」セクションを参照してください)
-   .ToArray()
-   .ToList()
-   .Count()
-   .OrderBy()
-   .OrderByDescending()
-   .ThenBy()
-   .ThenByDescending()
-   .OfType<T>()
-   .Skip() および .Take() (検索結果ページネーション参照)
-   .FirstOrDefault()
-   .First()
-   .Single()
-   .SingleOrDefault()
-   \== および !=
-   < および \>
-   <= および \>=
-   && および ||

### xConnect特有の拡張

-   .GetBatchEnumerator() / .GetBatchEnumeratorSync()
-   .ToSearchResults()
-   .WithExpandOptions()
-   .AsEnumerable() (同期のみ)

## サポートされていません

以下の拡張メソッドはサポートされていません:

-   Contains
-   StartsWith
-   EndsWith
-   ToString
-   Equals

> !注Like() 拡張方法は存在しません。

以下のシナリオは、xConnect検索のいかなる検索プロバイダーでもサポートされていません。

### 検索式内のカスタムメソッド

xConnectクライアントAPIはLINQクエリ式内でカスタムメソッド呼び出しをサポートしていません。例外Sitecore.XConnect.Search.YourLinqIsTooStrongException表示されます。

### Search for null values

現在、ファセットがnullかどうかを確認することは不可能です。例えば:

var notWebVisits = client.Interactions.Where(c => c.WebVisit() == null);

### カスタムイベントプロパティ内の時間帯によるSearch

以下のクエリ(カスタムTimespanプロパティを使用)は動作しません:

var interactions = await \_client.Contacts.Where(c => c.Interactions.Any(i => i.Events.OfType<CampaignEvent>().Any(e => e.CustomCampaignTimespan == TimeSpan.Zero)));

デフォルトのDurationプロパティはイベントに使えます。この制限はイベントにのみ適用され、ファセットには適用されません。

### まず、FirstOrDefault、Last、LastOrDefault、またはLINQ式内のカウント

以下のクエリはFirst()を使ったため動作しません:

var interactions = await \_client.Interactions.Where(i => i.Events.First().EngagementValue == 11).ToList();

以下のクエリはFirstOrDefault()を使ったため動作しません:

var contacts = await \_client.Contacts.Where(contact => contact.Interactions.OrderByDescending(x => x.StartDateTime).FirstOrDefault().WebVisit().SiteName == "value");

以下のクエリはLast()を使ったため動作しません:

var contacts = await \_client.Contacts.Where(contact => contact.Interactions.Last().WebVisit().SiteName == value);

### 期間

TimespanOfType演算子とTimespanプロパティ(例:Hours, Minutes, Seconds etc.)を組み合わせたクエリでは使用できません。

これは以下の通りです:

events.OfType<SomeEventType>(e => e.SomeTypeTimeSpanField > TimeSpan.FromHours(2))

これはうまくいきません:

events.OfType<SomeEventType>(e => e.SomeTypeTimeSpanField.Hours > 10)

### 複素リストへのパスにおける重複名

以下のクエリはサポートされていません。なぜなら、Path.To.Nestedは両方のリストで同じだからです。

-   i.Scores().Scores.Any(s=>s.Path.To.Nested.Any())
-   i.ProfileScores().ProfileScores.Any(s=>s.Path.To.Nested.Any())

## サポートされていません(Azure Search)

以下の制限は、xConnect検索のプロバイダー Azure Search特有のものです。

-   contact.Interactions.Any():Azure Searchプロバイダーは結合をサポートしていません。詳細については、「検索と[連絡先Search](https://doc.sitecore.com/xp/ja/developers/91/sitecore-experience-platform/search-contacts.html "Search contacts")[の使い方](https://doc.sitecore.com/xp/ja/developers/91/sitecore-experience-platform/work-with-search.html "Work with search")(結合の有無の例を含む)」をご覧ください。
    
    > !重要この制限は、Azure Searchで使用できるセグメンテーションルールに影響を与えます。例えば、メールイベント(開封やメールのクリック、リンクのクリックなど)で連絡先を絞り込むことはできません。
    

## リストのフィールド制限(Azure Search)

以下のリストは、Azure Searchにおける [複素型の制限](https://feedback.azure.com/forums/263029-azure-search/suggestions/6670910-modelling-complex-types-in-indexes) に関するものです。

### 9.0アップデート2

9.0アップデート2では、複素型リスト内の比較の改善が導入されました。

#### サポートされていません

**文字列、エナック、Guid**のネストリストの場合、以下のものはサポートされていません。

-   !=
-   \>
-   \>=
-   <
-   <=
-   !=

以下のクエリはサポートされていません:

-   c=>c.SomeFacet().SomeList.Any(e=>e!="hello")
-   c=>c.SomeFacet().SomeList.Any(e=>e!="hello"||e!="world")

以下のクエリがサポートされています:

-   c=>c.SomeFacet().SomeList.Any(e=>e=="hello")
-   c=>c.SomeFacet().SomeList.Any(e=>e=="hello"||e=="world")

#### サポート

-   複雑な型のネスト型やintやfloatのような単純な型のリストの場合、すべての比較型をサポートしています:
    
    -   \==
    -   ||
    -   &&
    -   !
    -   \>
    -   \>=
    -   <
    -   <=
    -   !=
    
    以下のクエリがサポートされています:
    
    -   :c=>c.SomeFacet().SomeList.Any(e=>e.Property1>2)
    -   c=>c.SomeFacet().SomeList.Any(e=>e.Property1!=2)
    -   c=>c.SomeFacet().SomeList.Any(e=>e.Property1==2&&e.Property2=="string")
    -   c=>c.SomeFacet().SomeList.Any(e=>e.Property1==2||e.Property2=="string")
-   別のリストを含むリストの場合、ネストAny() を使ってそのリストにアクセスすることができます。例えば: someList.Any(v=>v.NestedList.Any(u=>u.SomeField==2))
    
-   文字列、列挙、Guidの入れ子リストでは、Any()述語内で\==と||を使用できます。以下のクエリがサポートされています:
    
    -   c=>c.SomeFacet().SomeList.Any(e=>e=="hello")
    -   c=>c.SomeFacet().SomeList.Any(e=>e=="hello"||e=="world")
-   OfType<T>呼び出しの後に続くAny()は、正確な型のフィールドや基底クラスのフィールドを参照することができます。以下のクエリがサポートされています:
    
    -   i=>i.Events.OfType<Outcome>().Any(o=>o.MonetaryValue>10)
    -   i=>i.Events.OfType<Outcome>().Any(o=>o.DefinitionId==someId)

### 9.0初期リリースと9.0アップデート1

#### サポートされていません

ネストリストの場合、Any() 述語内で===のみが使用可能です。例えば、MyListProperty.Any(v=>v.SomeField==2)。以下はサポートされていません:

-   &&
-   ||
-   !
-   \>
-   \>=
-   <
-   <=
-   !=

その結果、以下のクエリはサポートされていません。

-   :c=>c.SomeFacet().SomeList.Any(e=>e.Property1>2)
-   c=>c.SomeFacet().SomeList.Any(e=>e.Property1!=2)
-   c=>c.SomeFacet().SomeList.Any(e=>e.Property1==2&&e.Property2=="string")
-   c=>c.SomeFacet().SomeList.Any(e=>e.Property1==2||e.Property2=="string") (このクエリは c=>c.SomeFacet().SomeList.Any(e=>e.Property1==2)||c=>c.SomeFacet().SomeList.Any(e=>e.Property2=="string")として書き換えられ、サポートされています)

OfType<T>呼び出しの後に続くAny()は、指定された正確なタイプのフィールドのみを参照でき、基本クラスを参照することはできません。以下のクエリはサポートされていません:

-   i=>i.Events.OfType<Outcome>().Any(o=>o.MonetaryValue>10) ( MonetaryValue は Outcomeの性質であるが、 Any() は \>では使えない)
-   i=>i.Events.OfType<Outcome>().Any(o=>o.DefinitionId==someId) (DefinitionId は基底クラスの性質であり、 Outcomeの性質ではありません)

#### サポート

以下のクエリがサポートされています:

-   c=>c.InteractionCache().InteractionCaches.Any(i=>i.Goals.Any(i=>i.DefinitionId==1234567))
-   別のリストを含むリストの場合、ネスト Any() を使ってそのリストにアクセスすることができます。例えば: someList.Any(v=>v.NestedList.Any(u=>u.SomeField==2))