1. LINQ

LINQ を使用したクエリの作成

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

このセクションでは、Sitecore Content Hub で特定のエンティティを検索するクエリを作成する方法について説明します。

クエリ オブジェクト自体はクエリを実行しませんが、クエリの条件を記述します。 クエリ クライアントがクエリの実行を担当します。

最初に、Sitecore Content Hubでの LINQ クエリのオプションと構造について説明し、最後にいくつかの例を示します。

LINQ の開始方法

クエリを作成するための推奨される方法は、LINQ を使用することです。 LINQ に慣れていない場合は、 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/getting-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)
  • Identifier (long)
  • 定義
    • id (long)
    • name (string)
  • 作成者
    • user id (long)
    • user name (string)
  • 変更者
    • user id (long)
    • user name (string)
  • Created on (DateTime)
  • Modified on (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);

サポートされている比較演算子

システム プロパティ

システム プロパティのデータ型によって、次のようになります。

  • long: ==!=
  • string: ==!=
  • DateTime: ==!=><>=<=

たとえば、指定した日付以降に変更されたエンティティをフィルタリングするには、次のようにします。

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

プロパティ

プロパティのデータ型によって、次のようになります。

  • string: ==!=
  • int: ==!=><>=<=
  • long: ==!=><>=<=
  • decimal: ==!=><>=<=
  • bool: ==!=
  • DateTime: ==!=><>=<=
  • DateTimeOffset:==!=><>=<=

たとえば、タイトルが「Logo」ではないエンティティをフィルタリングするには、次のようにします。

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

その他のプロパティ フィルター

「in」フィルター

In フィルターを使用すると、コレクションまたはコンマ区切りの値を指定できます。これにより、単一の値ではなく複数の値をフィルタリングできます。

In フィルターがサポートされているのは、次のとおりです。

  • エンティティ ID
  • エンティティ識別子
  • プロパティ値
  • リレーション値 (親 ID のみ)

タイトルが「Logo」または「Poster」に設定されているエンティティを見つけましょう。

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

文字列フィルター

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

  • Contains: 値に指定された部分文字列が含まれている必要があります。
  • StartsWith: 値が指定された部分文字列から始まる必要があります。
  • EndsWith: 値が指定された部分文字列で終わる必要があります。

これらのフィルターでは大文字と小文字は区別されません。

次のクエリを使用すると、Title プロパティに「logo」が含まれるすべてのエンティティが見つかります。

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句では、読み込みオプションと設定操作のみがサポートされています。

読み込みオプションと設定操作

[!注意] バージョン 3.1 以降、これらの操作は廃止されています。 読み込み設定とクエリ オブジェクトは分離されており、個別のパラメーターとして渡す必要があります (該当する場合)。

サポートされている選択オプションは、次のとおりです。

  • InCultures: 指定されたカルチャのエンティティを読み込みます
  • WithProperties: 指定されたプロパティをエンティティに読み込みます
  • WithRelations: 指定されたリレーションをエンティティに読み込みます
  • LoadConfiguration: 指定された読み込み設定でエンティティを読み込みます

これらの選択オプションの複数を組み合わせることができます。 最新の操作は、その前に該当する操作があれば必ずそれを上書きします。

この例では、 既定のカルチャとすべてのプロパティを読み込んでリレーションは読み込まないという既定のクエリ読み込み設定から始めて、AssetTypeToAssetリレーションを追加します。 WithRelations は、その前に設定された読み込み設定のリレーション読み込みオプションを上書きします。

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

[!注] 詳細については、読み込み設定を参照してください。

結果演算子

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

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);

プロパティ値で検索

プロパティ Title が「Logo」に設定されているを持つすべてのエンティティを検索します。

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

特定のカルチャのプロパティ値で検索

英語カルチャでプロパティ Description が「Hello world!」に設定されているすべてのエンティティを検索します。

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);

より高度なクエリ

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

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));
この記事を改善するための提案がある場合は、 お知らせください!