Realm .NET での LINQ サポート
Realm でクエリを作成するには、 Realm.All<T>()
メソッドを使用してIQueryable<T>
インスタンスを取得します。 これに、以下に記載する演算子を適用できます。
制限演算子
Where
はサポートされています。 OfType
は ではありませんが 、Realm のクエリは常に最初に指定されたクラスのコレクションで構成されるため、冗長になります。
Where
は述語を取ります。 Realm クエリの述語に対してサポートされている操作を確認するには、「述語操作 」セクションを参照してください。
例:
var oldDogs = realm.All<Dog>().Where(dog => dog.Age > 8);
順序演算子
OrderBy
、 OrderByDescending
、 Thenby
、 ThenByDescending
はすべてサポートされています。 Reverse
はまだサポートされていません。 現在は、クエリしているクラスの永続的なプロパティによってのみ順序付けできます。 つまり、 dogs.OrderBy(dog => dog.Owner.FirstName)
などはまだサポートされていません。
例:
var contacts = realm.All<Person>().OrderBy(p => p.LastName).ThenBy(p => p.FirstName);
変換演算子
ToArray
、 ToList
、 ToDictionary
、 ToLookup
はすべてサポートされています。 Cast
は有効ではありませんが、Realm のクエリは常に最初に指定されたクラスのコレクションで構成されるため、冗長になります。
例:
var phoneBook = realm.All<Person>().ToDictionary(person => person.PhoneNumber);
要素演算子
すべての主要な要素演算子がサポートされています。
First
およびFirstOrDefault
Last
およびLastOrDefault
Single
およびSingleOrDefault
これらのメソッドでは、任意の述語が使われます。 Realm クエリの述語に対してサポートされている操作を確認するには、「述語操作 」セクションを参照してください。
インデックスによる単一要素へのアクセスは、 ElementAt
とElementAtOrDefault
でサポートされています。
がdefault(T)の標準 C# 動作であるため、一致する要素がない場合、バリアント...OrDefault
は単一の null RealmObject
を返すことに注意してください。
DefaultIfEmpty
はまだサポートされていません。
Quantifiers
Any
はサポートされています。
Any
は任意述語を取ります。 Realm クエリの述語に対してサポートされている操作を確認するには、「述語操作 」セクションを参照してください。
集計演算子
Count
はサポートされています。
LongCount
、 Sum
、 Min
、 Max
、 Average
はまだサポートされていません。
Count
は任意述語を取ります。 Realm クエリの述語に対してサポートされている操作を確認するには、「述語操作 」セクションを参照してください。
述語操作
一般に、Realm のデータに依存する条件を持つ述語のみを作成できます。 クラスをイメージする
class Person : RealmObject
{
// Persisted properties
public string FirstName { get; set; }
public string LastName { get; set; }
// Non-persisted property
public string FullName => FirstName + " " + LastName;
}
このクラスの場合、 FirstName
とLastName
プロパティには適用されるがFullName
プロパティには適用されない条件を持つクエリを作成できます。 同様に、 [Ignored]
属性を持つプロパティは使用できません。
現在、プロパティは条件の左側である必要があることに注意してください。 つまり、
var oldDogs = realm.All<Dog>().Where(dog => 7 < dog.Age); // INVALID query, do not copy
は不正であり、同等に変更する必要があります
var oldDogs = realm.All<Dog>().Where(dog => dog.Age > 7); // Fixed
関係演算子
等価演算子は、 == 、 !=のすべてのプロパティ タイプに適用できます。
さらに、以下は数値型に使用できます。 < 、 <= 、 > 、 >=
string演算子
string では、 Contains
、 StartsWith
、 EndsWith
、 Equals
、 Like
を使用できます。
例:
var peopleWhoseNameBeginsWithJ = realm.All<Person>.Where(p => p.FirstName.StartsWith("J"));
デフォルトでは、Realm は大文字と小文字を区別する比較を実行しますが、 StringComparison.OrdinalIgnoreCase
引数を指定してそれを上書きできます。 古い .NET フレームワークで を受け入れる のオーバーロードがないため、クエリ時に使用できる ヘルパーContains
StringComparison
メソッド を提供しました。
var peopleWhoseNameContainsA = realm.All<Person>().Where(p => QueryMethods.Contains(p.FirstName, "a", StringComparison.OrdinalIgnoreCase));
Like
クエリ メソッドは、string プロパティとパターンを比較するために使用できます。 ?
と*
はワイルドカード文字として使用できます。 ?
は 1 文字に、 *
は 0 文字以上の文字に一致します。
var words = realm.All<Word>().Where(p => QueryMethods.Like(p.Value, "?bc*"));
// Matches abc, cbcde, but not bcd
クエリ式で使用されない場合、 Like
は 正規表現 を使用して同じルールを適用します。
構成
括弧と||を使用できます。クエリを作成するには、 および演算子を使用します。
例:
var PuppyRexes = realm.All<Dog>().Where(dog => dog.Age < 2 && dog.Name == "Rex");
ライブアフィニティに関するメモ
Realm クエリは、データベースの現在の状態を引き続き表現するという意味でライブです。
realm.Write(() =>
{
realm.Add(new Person { FirstName = "John" });
realm.Add(new Person { FirstName = "Peter" });
});
var js = realm.All<Person>().Where(p => p.FirstName.StartsWith("J"));
foreach(var j in js)
{
Console.WriteLine(j.FirstName); // ==> John
}
realm.Write(() =>
{
realm.Add(new Person { FirstName = "Joe" });
});
foreach(var j in js)
{
Console.WriteLine(j.FirstName); // ==> John, Joe
}
これは、クエリの結果が取得され、そのままメモリに保存されるオブジェクト/リレーショナル マッパー(ORM)の通常の動作とは異なります。
ただし、LINQ to Objects の動作とは異なります。ここでは、反復ごとに式が再評価され、条件の両方の変更が結果に影響します。 Realm クエリは、最初の実行で条件の右側を評価します。 したがって、次のようなクエリがあるとします。
var recentLogEntries = realm.All<LogEntry>().Where(l => l.TimeStamp > DateTime.Now.AddHours(-1));
ここで、 recentLogEntries
変数には、クエリが最初に実行された時刻の 1 時間以上前からTimeStamp
を持つすべてのログエントリが含まれます(各、 ToList
など)。 新しく追加されたログ エントリは後続の の実行に含まれますが、比較される時間は更新されません。
まだサポートされていません
次の機能はまだサポートされていません。 Realm アーキテクチャではこれらは不要になっているため、一部はサポートされません。
グループ化演算子
GroupBy
はサポートされていません。
集合演算子
Distinct
、 Union
、 Intersect
、 Except
はサポートされていません。
パーティショニング演算子
Take
、 Skip
、 TakeWhile
、 SkipWhile
はまだサポートされていません。
これらは、ORM を使用する場合よりも重要ではありません。 Realm のゼロコピー パターンの場合、オブジェクトのプロパティがアクセスされたときにのみデータがデータベースから読み取られるため、結果の一部を反復処理するだけのオーバーヘッドはほとんどありません。
プロジェクション 演算子
Select
とSelectMany
はまだサポートされていません。
クエリ構文で使用される選択キーワードは、生成されたものではなく、 RealmObject
自体を選択している限りサポートされます。
var oldDogs = from d in realm.All<Dog>() where d.Age > 8 select d;
連結演算子
Concat
はサポートされていません。
結合演算子
Realm を使用する場合は、関係データベースと ORM を使用する場合よりも結合の重要性が低いことに注意してください。 キーを使用して関係を識別する代わりに、関連するオブジェクトを参照します。
クラスが指定された場合
public class Address : RealmObject
{
public string StreetName { get; set; }
public int Number { get; set; }
}
次のように、別のクラスでそれを使用することができます。
public class Customer : RealmObject
{
public string Name { get; set; }
public Address Address { get; set; }
}
これは、C# の通常の参照と同様に機能します。つまり、2 つのCustomer
インスタンスが同じAddress
オブジェクトに割り当てられている場合、そのアドレスへの変更は両方のカスタマー オブジェクトに適用されます。