You can retrieve an object by PrimaryKey very quickly using Realm.Find which performs more streamlined query construction than using LINQ, as well as using an index. Trying to create another object with the same key will throw a RealmDuplicatePrimaryKeyValueException.
Once an object with a PrimaryKey is added to a Realm, the PrimaryKey cannot be changed. Putting the attribute on multiple properties will compile but is validated at runtime and will throw an exception reporting that Schema validation failed, as soon as you try to open that Realm. They are supported only in case you already have a property of that type. There is no particular storage or performance advantage to using char or smaller integer types. Only chars, integral types, and strings can be used as PrimaryKeys. Declaring a PrimaryKey allows objects to be looked up and updated efficiently and enforces uniqueness for each value. The attribute can be specified on one property in a RealmObject class. You can subscribe to Realm notifications to know when Realm data in an object is updated, indicating when your app’s UI should be refreshed. For example, if your UI code is dependent on a specific Realm object, you don’t need to worry about refreshing or re-fetching it before triggering a UI redraw.
This aspect of RealmObject not only keeps Realm fast and efficient, it allows your code to be simpler and more reactive. Define your models like regular C# classes public class Dog : RealmObject myDog.