2 votes

RavenDB - condition where on included object

Permettez d'avoir ces objets :

public class Obj1
{
    public string Id { get; set; }
}

public class Obj2
{
    public string Id { get; set; }
    public string Obj1Id { get; set; }
}

public class Obj3
{
    public string Id { get; set; }
    public string Obj2Id { get; set; }
}

J'utilise l'inclusion de cette manière :

var objs3 = session.Query()
    .Customize(x => x.Include(o3 => o3.Obj2Id))
    .Take(1000)
    .ToList();
foreach (var obj3 in objs3)
{
    var obj2 = session.Load(obj3.Obj2Id);
    //faire quelque chose avec cela
}

Ma question est, y a-t-il possibilité d'ajouter à la requête quelque chose comme .Where(o2 => o2.Obj1Id == "some/Id") ? La requête ne sait rien sur Obj2 du côté client (Linq), mais du côté serveur, elle travaille avec eux, car cela ne fait qu'une seule requête à la base de données.

J'essaie de voir comment fonctionnent les index et les projections, mais je n'ai pas de chance avec certaines constructions. Peut-être que ma vision est déformée par les bases de données relationnelles et qu'il y a d'autres solutions qui nécessitent que mes structures soient redéfinies...

Ma autre solution est d'ajouter Obj1Id à Obj3, mais cela fera des duplicatas (je peux vivre avec cela ;) )

Quelques informations supplémentaires sur les objets :
- Obj1 est unique pour chaque client, donc il y a environ 200 documents
- Obj2 : Obj3 sont des frères et sœurs 1 : 1, chacun avec ses propres propriétés point de vue, environ 100 000 pour chaque client

Question bonus : Y a-t-il quelque chose comme une chaîne de Inclusion ? Inclure Obj1 à l'intérieur de l'inclusion de Obj2 ? (cela je ne vais pas utiliser, c'est juste une question)

1voto

frontsideair Points 221

Non, vous ne pouvez pas ajouter de condition à l'inclusion. C'est soit tout à fait inclus, soit pas du tout.

0voto

Daniel Lang Points 4968

Comme l'a dit Oren, vous avez une condition dans l'inclure. Vous pouvez donc soit restructurer vos données, soit utiliser une carte multiple (et peut-être aussi réduire) l'index si Obj2 et Obj3 ont quelque chose en commun, comme l'Id de Obj1.

La meilleure façon dans votre cas dépend vraiment du type de données que vous avez, pas de réponse générale ici. (Peut-être pouvez-vous poster une autre question, plus concrète, avec des noms de classes réels au lieu de noms abstraits comme Obj1-3).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X