La documentation Realm donne un exemple de backlinks utilisant un objet person et un objet dog. Si j'étends cela pour inclure aussi les chats, alors une personne peut avoir plusieurs chiens ou chats à marcher, et chaque chien ou chat peut être promené par plusieurs personnes différentes.Domaine de requête avec plusieurs backlinks
public class Dog : RealmObject
{
public string Name { get; set; }
[Backlink(nameof(Person.Dogs))]
public IQueryable<Person> Walkers { get; }
}
public class Cat : RealmObject
{
public string Name { get; set; }
[Backlink(nameof(Person.Cats))]
public IQueryable<Person> Walkers { get; }
}
public class Person : RealmObject
{
//... other properties (name, age, address, etc.)
public IList<Dog> Dogs { get; }
public IList<Cat> Cats { get; }
}
À l'aide des backlinks me permet d'obtenir une liste de personnes qui marchent le chien Fido ...
var fidoWalkers = realm.All<Dog>().Where(d => d.Name == "Fido").FirstOrDefault().Walkers;
Je peux maintenant élargir davantage cette requête pour trouver les marcheurs de Fido qui vivent dans High Street ou qui ont moins de 30 ans ou quoi que ce soit ... génial jusqu'ici.
Maintenant, je veux obtenir une liste des personnes qui promènent le chien Fido et le chat Moggie. En utilisant les backlinks dans deux déclarations distinctes, j'ai pu obtenir deux ensembles de résultats, un pour les marcheurs Fido et un pour les marcheurs Moggie, mais je ne sais pas comment les combiner. Je ne puis trouver une requête qui me permettrait de faire ce « le long chemin rond » sans utiliser les backlinks, car chaque fois que j'essaie d'utiliser
...Where(P => p.Dogs.Contains(Fido))...
Je reçois « System.NotSupportedException: La méthode CONTAINS est non pris en charge '
Existe-t-il un moyen d'obtenir une liste de personnes filtrées par les listes Chiens et Chats?
Grande réponse merci - maintenant je comprends beaucoup mieux. Mes modèles actuels sont évidemment beaucoup plus complexes (en fait, un catalogue d'objets de couture, chacun avec plusieurs types de vêtements, types de tissus, catégories et étiquettes, etc.) mais je vais examiner les aspects pratiques de la modification de la structure du modèle. de l'exécution des requêtes LINQ sur les listes en mémoire. Encore quelques expérimentations ... – sparks
@sparks Pas de problème, Personnellement, je pense que l'une des choses requises pour une utilisation mémoire/CPU optimale lors de l'utilisation de Realm est la possibilité de concevoir votre modèle de domaine qui correspond au modèle d'utilisation de votre application. Quand un client dit que le modèle ne peut * pas * changer ** la période **, je me tourne vers SQLite. Lorsque nous avons la liberté de repenser le modèle du point de vue de l'utilisation d'une application, Realm peut être étonnant en termes de performance, d'utilisation d'objets "live", etc ... mais habituellement le modèle original se termine (fortement) dé-normalisé et nous créons une carte de données sur le serveur pour gérer la sérialisation/désérialisation JSON ... – SushiHangover
@sparks En termes de 'pattern d'utilisation de l'application', je regarde ce qui est affiché par page, écran, table, Activity, Fragment, UITableView, etc ... et c'est le début de mon modèle de royaume pour chaque vue d'application. Si elle n'est pas affichée à l'écran, triée par, ou une clé primaire/cachée utilisée pour l'API/sync/etc ... Je ne l'inclue pas. Une fois que toutes les informations sont affichées dans l'application, il devient "facile" ;-) de modéliser tous ces petits fragments en un modèle consolidé normalisé qui est très performant .... Les versions d'applications qui changent le modèle sont gérer via les migrations de domaine. – SushiHangover