Requête avec filtre builder sur un tableau imbriqué à l'aide de MongoDB C# pilote
Envisager la suite de la structure de l'objet stocké en tant que documents:
public class Foo
{
public string Id { get; set; }
public ICollection<FooBar> Bars { get; set; }
//...
}
public class FooBar
{
public string BarId { get; set; }
//...
}
À l'aide d'une requête LINQ-style avec le pilote, je peux Find
tous Foo
qui contiennent un FooBar
BarId
comme ceci:
var foos = await m_fooCollection.Find( f => f.Bars.Any( fb => fb.BarId == "123") ).ToListAsync();
Comment puis-je parvenir à cette même requête à l'aide de la FilterDefinitionBuilder
au lieu de l'en-ligne LINQ sur Find
?
Il n'est pas LINQ, juste une expression lambda.
En effet, mais cette méthode ne sera jamais appelé. Le pilote se traduit par l'expression d'un mongo requête.
Ok, fait sens. Je pense que j'ai été plus d'essayer d'exprimer le fait que je suis à l'aide de LINQ la syntaxe de style, plutôt que de véritables LINQ.
Oui, il n'a pas vraiment d'importance. Juste une remarque pour l'avenir googlers.
.Any
sur un ICollection
fait partie de la Enumerable
classe dans le System.Linq
espace de noms, non?En effet, mais cette méthode ne sera jamais appelé. Le pilote se traduit par l'expression d'un mongo requête.
Ok, fait sens. Je pense que j'ai été plus d'essayer d'exprimer le fait que je suis à l'aide de LINQ la syntaxe de style, plutôt que de véritables LINQ.
Oui, il n'a pas vraiment d'importance. Juste une remarque pour l'avenir googlers.
OriginalL'auteur kspearrin | 2015-06-22
Vous devez vous connecter pour publier un commentaire.
La requête, vous devez effectuer utilise le
$elemMatch
opérateur de requête.Donc, cette requête à l'aide d'une expression lambda
Est équivalent à celui de cette requête à l'aide de la
FilterDefinitionBuilder
:cela renvoie toutes les
Foo
objets correspondant aux critères à chaque objet ayant TOUTES sesFooBar
enfants. Que faire si j'ai besoin de filtrer les objets enfants (avecBarId = "123"
) afin de ne pas tous FooBar sera présent dans le résultat?Je ne pense pas que vous pouvez le faire avec un "simple" de la requête. Je pense que vous avez besoin d'utiliser l'agrégation de cadre, mais je ne suis pas sûr. Peut-être que vous seriez mieux poser une autre question...
OriginalL'auteur i3arnon