データのフィルタリングとソート - .NET SDK
Realm 内のデータをクエリ、フィルタリング、ソートするには、Realm クエリ エンジンを使用します。 .NET SDK でクエリ エンジンを使用する方法は 2 つあります。
.NET の規則に準拠しているため、可能な限りクエリには LINQ 構文を使用する必要があります。
注意
このページの例について
このページの例では、タスク リスト アプリの単純なデータセットを使用しています。 Realm の 2 つのオブジェクトタイプは、 Project
とTask
です。 Task
には、名前、割り当て者の名前、完了したフラグがあります。 優先順位には任意の数値があり、優先順位が高いほど重要であり、その作業に費やされた時間数も存在します。 Project
には 0 個以上のTasks
があります。
これらの 2 つのクラス、 Project
とTask
のスキーマを以下で参照してください。
public partial class Items : IRealmObject { [ ] [ ] 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 { [ ] [ ] public ObjectId ID { get; set; } = ObjectId.GenerateNewId(); public string Name { get; set; } public IList<Items> Items { get; } }
LINQ によるクエリ
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 演算子を使用して、string の値を比較できます。 正規表現のようなワイルドカードを使用すると、検索の柔軟性が向上します。
演算子 | 説明 |
---|---|
StartsWith | 左側の文字string式が右側のstring式で始まる場合は、 true と評価されます。 これは contains と似ていますが、左側のstring式が右側のstring式の先頭にある場合にのみ一致します。 |
EndsWith | 左側の文字string式が右側のstring式で終わる場合は、 true と評価されます。 これは contains と似ていますが、左側のstring式が右側のstring式の最後に見つかった場合にのみ一致します。 |
Like | 左側の string 式が右側の string ワイルドカード string 式と一致する場合、
たとえば、ワイルドカードstring 「d?g」は、「dog」、「dig」、および「dgs」と一致しますが、「ding」、「dg」、または「adog」には一致しません。 |
Equals | |
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 演算子
次の LINQ 演算子は現在、Realm .NET SDK ではサポートされていません。
カテゴリ | サポートされていない演算子 |
---|---|
Concatenation |
|
Grouping |
|
Partitioning |
|
Projection |
|
Sets |
|
RQLを使用したクエリ
RQL ( RQL )を使用して Realm をクエリすることもできます。 RQL は、クエリ エンジンにアクセスするために使用される string ベースのクエリ言語です。 RQL を使用する場合は、 Filter()メソッドを使用します。
var elvisProjects = projects.Filter("Items.Assignee == $0", "Elvis");
重要
集計演算子
集計演算子はコレクションを走査して、単一の値に縮小します。 集計では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);