Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

データのフィルタリングとソート - .NET SDK

項目一覧

  • LINQ によるクエリ
  • 比較演算子
  • 論理演算子
  • string演算子
  • 全文検索
  • サポートされていない LINQ 演算子
  • RQLを使用したクエリ
  • 集計演算子
  • 全文検索
  • クエリ結果のソート

Realm 内のデータをクエリ、フィルタリング、ソートするには、Realm クエリ エンジンを使用します。 .NET SDK でクエリ エンジンを使用する方法は 2 つあります。

  • LINQ Syntax

  • RQL

.NET の規則に準拠しているため、可能な限りクエリには LINQ 構文を使用する必要があります。

注意

このページの例について

このページの例では、タスク リスト アプリの単純なデータセットを使用しています。 Realm の 2 つのオブジェクトタイプは、 ProjectTaskです。 Taskには、名前、割り当て者の名前、完了したフラグがあります。 優先順位には任意の数値があり、優先順位が高いほど重要であり、その作業に費やされた時間数も存在します。 Projectには 0 個以上のTasksがあります。

これらの 2 つのクラス、 ProjectTaskのスキーマを以下で参照してください。

public partial class Items : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
public string Name { get; set; }
public string Assignee { get; set; }
public bool IsComplete { get; set; }
public int Priority { get; set; }
public int ProgressMinutes { get; set; }
}
public partial class Project : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId ID { get; set; } = ObjectId.GenerateNewId();
public string Name { get; set; }
public IList<Items> Items { get; }
}

Realm のクエリエンジンは標準 LINQ を実装します 構文。

LINQ でRealm コレクションをフィルタリングするために使用できる演算子がいくつかあります。 フィルターは、フィルタリングされるコレクション内のすべてのオブジェクトの演算子式を評価することで機能します。 式がtrueに解決される場合、Realm は結果コレクションにオブジェクトを含めます。

式は、次のいずれかで構成されます。

  • 現在評価されているオブジェクトのプロパティの名前

  • 演算子

  • Realmで使用される任意の型の値(string、日付、数値、ブール値など)

注意

Realm .NET SDK は現在、すべての LINQ 演算子をサポートしていません。 サポートされていない演算子のリストについては、「サポートされていない LINQ 演算子」セクションを参照してください。

値の比較

演算子
説明
==
左側の式が右側の式と等しい場合は、 trueと評価されます。
>
左側の数値または日付式が右側の数値または日付式より大きい場合は、 trueと評価されます。 日付の場合、左側の日付が右側の日付より後の場合、これはtrueと評価されます。
>=
左側の数値または日付式が右側の数値または日付式より大きい場合、 trueと評価されます。 日付の場合、左側の日付が右側の日付より後のか同じである場合、これはtrueと評価されます。
<
左側の数値または日付式が右側の数値または日付式より小さい場合は、 trueと評価されます。 日付の場合、左側の日付が右側の日付よりも前の場合、これはtrueと評価されます。
<=
左側の数値式が右側の数値式より小さい場合、 trueと評価されます。 日付の場合、左側の日付が右側の日付よりも前の日付または同じ日付の場合、これはtrueと評価されます。
!=
左側の式が右側の式と等しくない場合、 trueと評価されます。

次の例では、クエリ エンジンの比較演算子を使用して次のようにします。

  • priorityプロパティ値の値をしきい値と比較して、優先順位の高いタスクを見つけます。どの優先順位を超えると、優先順位が高いと見なされます。

  • progressMinutesプロパティが特定の範囲内にあるかどうかを確認して、開始されたばかりのタスクまたは実行時間が短いタスクを見つけます。

  • assigneeプロパティがnullに等しいタスクを見つけて、割り当てられていないタスクを見つけます。

  • assigneeプロパティが名前のリストにあるかどうかを確認して、特定のチームメイト エイリアスまたはレイテンシに割り当てられたタスクを見つけます。

var highPri = items.Where(i => i.Priority > 5);
var quickItems = items.Where(i =>
i.ProgressMinutes >= 1 &&
i.ProgressMinutes < 15);
var unassignedItems = items.Where(i =>
i.Assignee == null);
var AliOrJamieItems = items.Where(i =>
i.Assignee == "Ali" ||
i.Assignee == "Jamie");

次の表にリストされている論理演算子を使用して、複合述語を作成できます。

演算子
説明
&&
左側の式と右側の式の両方がtrueである場合は、 trueと評価されます。
!
指定された式の結果を否定します。
||
いずれかの式がtrueを返す場合、 trueと評価されます。

クエリ言語の論理演算子を使用して、Ali の完了したタスクをすべて検索できます。 つまり、 assigneeプロパティ値が 'Ali' に等しく、かつisCompleteプロパティ値がtrueであるすべてのタスクを検索します。

var completedItemsForAli = items
.Where(i => i.Assignee == "Ali" && i.IsComplete);

次の表にリストされている string 演算子を使用して、string の値を比較できます。 正規表現のようなワイルドカードを使用すると、検索の柔軟性が向上します。

演算子
説明
StartsWith
左側の文字string式が右側のstring式で始まる場合は、true と評価されます。 これは contains と似ていますが、左側のstring式が右側のstring式の先頭にある場合にのみ一致します。
EndsWith
左側の文字string式が右側のstring式で終わる場合は、true と評価されます。 これは contains と似ていますが、左側のstring式が右側のstring式の最後に見つかった場合にのみ一致します。
Like

左側の string 式が右側の string ワイルドカード string 式と一致する場合、 trueと評価されます。 ワイルドカードstring式は、2 つの特殊なワイルドカード文字を含む通常の文字を使用するstringです。

  • *ワイルドカードは、0 個以上の任意の文字と一致します

  • ?ワイルドカードは任意の文字に一致します。

たとえば、ワイルドカードstring 「d?g」は、「dog」、「dig」、および「dgs」と一致しますが、「ding」、「dg」、または「adog」には一致しません。

Equals
true左側のstring が 辞書以下string の場合、 と評価される 右側の と等しい。
Contains
左側のstring式が右側のstring式のどこにある場合は、true と評価されます。
string.IsNullOrEmpty
左側のstring式が null または空の場合、trueと評価されます。 IsNullOrEmpty()stringの静的メソッドであることに注意してください。

次の例では、クエリ エンジンの string 演算子を使用してタスクを検索します。

// Note: In each of the following examples, you can replace the
// Where() method with First(), FirstOrDefault(),
// Single(), SingleOrDefault(),
// Last(), or LastOrDefault().
// Get all items where the Assignee's name starts with "E" or "e"
var ItemssStartWithE = items.Where(i => i.Assignee.StartsWith("E",
StringComparison.OrdinalIgnoreCase));
// Get all items where the Assignee's name ends wth "is"
// (lower case only)
var endsWith = items.Where(t =>
t.Assignee.EndsWith("is", StringComparison.Ordinal));
// Get all items where the Assignee's name contains the
// letters "ami" in any casing
var itemsContains = items.Where(i => i.Assignee.Contains("ami",
StringComparison.OrdinalIgnoreCase));
// Get all items that have no assignee
var null_or_empty = items.Where(i => string.IsNullOrEmpty(i.Assignee));

重要

大文字と小文字の比較

文字列を評価する場合、 Likeを除くすべての関数の 2 番目のパラメーターはStringComparison.OrdinalIgnoreCaseまたはStringComparison.Ordinalのいずれかである必要があります。 Like()メソッドの場合、2 番目のパラメータはブール値("true" は "大文字と小文字を区別する"ことを意味します)。

LINQ を使用して、全文検索インデックス(FTS)を持つプロパティをクエリできます。 これらのプロパティをクエリするには、 Queryメソッド.FullTextSearchを使用します。 次の例では、 Person.Biographyフィールドをクエリします。

// Find all people with "scientist" and "Nobel" in their biography
var scientists = realm.All<Person>()
.Where(p => QueryMethods.FullTextSearch(p.Biography, "scientist Nobel"));
// Find all people with "scientist" in their biography, but not "physics"
var scientistsButNotPhysicists = realm.All<Person>()
.Where(p => QueryMethods.FullTextSearch(p.Biography, "scientist -physics"));

次の LINQ 演算子は現在、Realm .NET SDK ではサポートされていません。

カテゴリ
サポートされていない演算子
Concatenation
  • Concat

  • JoinJoinはサポートされていませんが、Realm では必要ありません。 結合ステートメントでキーを使用する代わりに、従来の関係データベースと同様に、別の型をプロパティとして参照できます。 詳細については、「埋め込みオブジェクト - .NET SDK 」を参照してください。

  • GroupJoin

Grouping
  • GroupBy

Partitioning
  • Take

  • Skip

  • TakeWhile

  • SkipWhile

Projection
  • SelectMany

  • Select、ただし、クエリ構文で使用する場合、Realm オブジェクトではなく Realm オブジェクト自体を選択する限り、 Selectはサポートされます。

    var tasks = from t in realm.All<Task>() where t.Assignee == "Caleb" select t;

Sets
  • Distinct

  • Union

  • Intersect

  • Except

RQL ( RQL )を使用して Realm をクエリすることもできます。 RQL は、クエリ エンジンにアクセスするために使用される string ベースのクエリ言語です。 RQL を使用する場合は、 Filter()メソッドを使用します。

var elvisProjects = projects.Filter("Items.Assignee == $0", "Elvis");

重要

LINQはクエリのコンパイルタイム エラー チェックを提供するため、ほとんどの場合、RQL の代わりにそれを使用する必要があります。 集計の使用など、LINQ の現在の機能を超える機能が必要な場合は、RQL を使用します。

集計演算子はコレクションを走査して、単一の値に縮小します。 集計ではFilter()メソッドが使用されることに注意してください。このメソッドは、LINQ プロバイダーによって現在サポートされていないより複雑なクエリを作成するために使用できます。 Filter()はフィルタリングに加えて、SORT 句と DNS 句をサポートしています。

使用可能な集計演算子の詳細については、 RQL集計演算子のリファレンスを参照してください。

次の例は、データを集計するさまざまな方法を示しています。

// Get all projects with an average Item priorty > 5:
var avgPriority = projects.Filter(
"Items.@avg.Priority > $0", 5);
// Get all projects where all Items are high-priority:
var highPriProjects = projects.Filter(
"Items.@min.Priority > $0", 5);
// Get all projects with long-running Items:
var longRunningProjects = projects.Filter(
"Items.@sum.ProgressMinutes > $0", 100);

RQL を使用して、全文検索インデックス(FTS)を持つプロパティをクエリできます。 これらのプロパティをクエリするには、 TEXT演算子を使用します。 次の例では、 Person.Biographyフィールドをクエリします。

// Find all people with "scientist" and "Nobel" in their biography
var filteredScientists = realm.All<Person>()
.Filter("Biography TEXT $0", "scientist Nobel");
// Find all people with "scientist" in their biography, but not "physics"
var filteredScientistsButNotPhysicists = realm.All<Person>()
.Filter("Biography TEXT $0", "scientist -physics");

ソート操作を使用すると、Realm がクエリされたオブジェクトを返す順序を構成できます。 結果コレクション内のオブジェクトの 1 つ以上のプロパティに基づいて並べ替えることができます。

Realm は、結果がソートされる場合にのみ、一貫した結果の順序を保証します。

次のコードは、プロジェクトを名前で逆アルファベット順にソートします(つまり 「降順」の順序)を超えるドキュメントを選択します。

var projectsSorted = projects.OrderByDescending(p => p.Name);

戻る

読み取り