---
title: "LINQクエリ"
slug: "linq-queries"
abstract: "LINQクエリの概要とその使い方、例付き。"
---
# LINQクエリ

このセクションでは、Sitecore Content Hubで特定のエンティティを探すためのクエリを作成する方法について説明します。クエリオブジェクト自体はクエリを実行しませんが、クエリの条件を記述します。クエリを実行する責任はクエリクライアントです。

## LINQを始めましょう

クエリを作成する推奨される方法はLINQを使うことです。LINQに馴染みがなければ、[https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/get-started-with-linq](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/get-started-with-linq)をご覧ください。

LINQクエリを完全に活用するには、以下の使い方を必ず用意してください。

using System.Linq;
using Stylelabs.M.Base.Querying;
using Stylelabs.M.Base.Querying.Linq;

## テンプレート

LINQテンプレートは以下の通りです:

var query = Query.CreateQuery(entities =>
 from e in entities
 where conditions
 orderby property ascending | descending
 select e);

where節の複数の条件は、&&を用いて連鎖できます。

orderby特定の(系)性質に基づいて結果を順序付けるために用いられます。これは上昇または下降のどちらかです。より複雑な順序付けには複数のorderby文を用いることができます。

## サポートされているエンティティフィルター

LINQクエリには、エンティティに関する以下のフィルターがサポートされています。

### システム特性

-   id(long)
-   識別子(long)
-   定義
    -   ID(long)
    -   名前(string)
-   作成者
    -   ユーザーID(long)
    -   ユーザー名(string)
-   修正者
    -   ユーザーID(long)
    -   ユーザー名(string)
-   (DateTime年)で作成
-   修正済み(DateTime)

例えば、IDでフィルタリングするには:

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.Id == entityId
 select e);

### エンティティメンバー

-   プロパティバリュー(特定の文化における価値のフィルタリングもサポート)
-   リレーションシップ( *親* IDのみでフィルタリング可能)

例えば、プロパティ値でフィルタリングする場合:

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.Property("Title") == "Logo"
 select e);

> !注LINQクエリには [さまざまな演算子](https://doc.sitecore.com/ch/ja/developers/cloud-dev/supported-linq-query-operators.html "Supported LINQ query operators") を使うことができます。

## システム特性

システムプロパティのデータ型に応じて:

-   長文: \==, !=
-   string: \==, !=
-   デートタイム: \==、 !=、 \>、 <、 \>=、 <=

例えば、指定された日付以降に修正されたエンティティをフィルタリングするには:

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.ModifiedOn > dateTime
 select e);

## 性質

プロパティデータ型によって異なります:

-   string: \==, !=
-   int: \==, !=, \>, <, \>=, <=
-   長: \==、 !=、 \>、 <、 \>=、 <=
-   小数点: \==、 !=、 \>、 <、 \>=、 <=
-   Bool: \==!=
-   デートタイム: \==、 !=、 \>、 <、 \>=、 <=
-   DateTimeOffset: \==, !=, \>, <, \>=, <=

例えば、タイトルが「Logo」でないエンティティをフィルタリングする:

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.Property("Title") != "Logo"
 select e);

## 追加のプロパティフィルター

## 「イン」フィルター

Inフィルターは、集合値やカンマ区切られた値を指定し、単一の値ではなく複数の値でフィルタリングすることを可能にします。

Inフィルターは以下の上でサポートされています:

-   エンティティID
-   エンティティ識別子
-   不動産価値
-   リレーション値(親IDのみ)

タイトルが「ロゴ」または「ポスター」に設定されているエンティティを探してみましょう。

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.Property("Title").In("Logo", "Poster")
 select e);

## ストリングフィルター

文字列プロパティはいくつかの追加フィルターをサポートしています:

-   Contains: 値は指定された部分文字列を含まなければなりません。
-   StartsWith: 値は指定された部分文字列で始まらなければなりません。
-   EndsWith: 値は指定された部分文字列で終わらなければなりません。

これらのフィルターは大文字を区別しません。

以下のクエリは、「logo」を含むTitleプロパティを持つすべてのエンティティを見つけるために使用できます。

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.Property("Title").Contains("logo")
 select e);

## 支持される順序

順序付けは以下の場所でサポートされています:

-   エンティティID
-   エンティティ識別子
-   定義ID
-   定義名称
-   ユーザーIDによって作成
-   ユーザー名で作成
-   ユーザーIDによって修正されています
-   ユーザー名によって修正されています
-   作成
-   改変
-   不動産価値

例えば、作成日にアセットを注文し、その後タイトル順に注文する場合:

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.DefinitionName == "M.Asset"
 orderby e.CreatedOn ascending
 orderby e.Property("Title") ascending
 select e);

## オプション選択

現在、select条項のサポートはロード操作と設定操作のみです。

## 装填オプションと構成

以下の選択されたオプションがサポートされています:

-   InCultures: は指定された文化内のエンティティを読み込みます。
-   WithProperties: はエンティティに指定されたプロパティをロードします。
-   WithRelations: はエンティティに指定された関係をロードします。
-   LoadConfiguration: は指定された [負荷構成](https://doc.sitecore.com/ch/ja/developers/cloud-dev/load-configurations.html "Load configurations")を持つエンティティを読み込みます。

これらの選択オプションの複数を連鎖させることができます。最後の操作は該当する場合、前の操作を上書きします。

この例では、デフォルトのクエリロード設定(デフォルトカルチャー、すべてのプロパティをロードし、関係なし)からAssetTypeToAssetリレーションを追加します。 WithRelationsは先ほどのロード設定セットのリレーションロードオプションを上書きします。

var query = Query.CreateQuery(entities =>
 from e in entities
 where conditions
 select e.LoadConfiguration(QueryLoadConfiguration.Default)
 .WithRelations(new RelationLoadOption("AssetTypeToAsset")));

## 結果演算子

skip (最初のx個のエンティティをスキップする)およびtake (x個エンティティを返す)もLINQ使用時にサポートされています。

var query = Query.CreateQuery(entities =>
 (from e in entities
 where your conditions
 select e)
 .Skip(5)
 .Take(5));

これはエンティティをIDの降順順に並べ、最初の5つのエンティティ(最新の5つのエンティティ)をスキップし、次の5つのエンティティを返します。

## 例

以下は例の一覧です。これらの例のほとんどは非常にシンプルで自明です。例は終盤に向かってより複雑になる傾向があります。

### ID

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.Id == entityId
 select e);

### 識別子別

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.Identifier == entityIdentifier
 select e);

### 定義上、ID

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.DefinitionId == definitionId
 select e);

### 定義上の名前

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.DefinitionName == "M.Asset"
 select e);

### ユーザーIDによって作成

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.CreatedById == demoUserId
 select e);

### ユーザー名によって作成されました

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.CreatedByUsername == "M.Demo.User"
 select e);

### ユーザーIDによって修正される

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.ModifiedById == demoUserId
 select e);

### ユーザー名によって修正されました

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.ModifiedByUsername == "M.Demo.User"
 select e);

### 作成者による

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.CreatedOn == dateTime
 select e);

また、2つの日付間で可能な場合もあります:

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.CreatedOn minDateTime && e.CreatedOn maxDateTime
 select e);

### 修正による

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.ModifiedOn == dateTime
 select e);

また、2つの日付間で可能な場合もあります:

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.ModifiedOn minDateTime && e.ModifiedOn maxDateTime
 select e);

### 財産価値による

「Logo」に設定されたプロパティTitleを持つすべてのエンティティを見つけます。

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.Property("Title") == "Logo"
 select e);

### 特定の文化における財産価値別

英語文化において「Hello world!」に設定されたプロパティDescriptionを持つすべてのエンティティを見つけます。

CultureInfo enUs = CultureInfo.GetCultureInfo("en-US");
var query = Query.CreateQuery(entities =>
 from e in entities
 where e.Property("Description", enUs) == "Hello world!"
 select e);

### 関係による親値

親プロパティはエンティティオブジェクト上でアクセスし、指定されたリレーションにクエリを行使できます。リレーションにクエリするには、リレーション名と親IDの指定が必要です。

var query = Query.CreateQuery(entities =>
 from e in entities
 where e.Parent("AssetTypeToAsset") == assetTypeId
 select e);

## より高度なクエリ

以下のクエリは、タイトルが*Logo*のM.Demo.Userによって作成された最後の10個のアセットを取得します。

var query = Query.CreateQuery(entities =>
 (from e in entities
 where e.DefinitionName == "M.Asset"
 && e.Property("Title") == "Logo"
 && e.CreatedByUsername == "M.Demo.User"
 orderby e.CreatedOn descending
 select e)
 .Take(10));