J'essaie d'écrire une méthode générique pour insérer un objet en tant que document incorporé. Le code ci-dessous fonctionne déjà mais je dois faire une méthode générique qui peut être mise dans un référentiel et appelée depuis le contrôleur. Je dois passer l'ID racine et l'objet sous-document qui doit être inséré.Aide avec une méthode d'insertion LINQ générique (Norm/MongoDB)
class Post
{
...
public IList<Comment> Comments { get; set; }
}
using (var db = Mongo.Create(session.ConnectionString()))
{
IMongoCollection<Post> _collection = db.GetCollection<Post>("Post");
var comment = new Comment();
comment.InjectFrom(commentViewModel.comment);
// Use below to add *NEW* embedded document
_collection.UpdateOne(
new { _id = commentViewModel.Id },
new { Comments = M.AddToSet(comment) }
);
}
À titre d'exemple, voici ce que je l'utilise pour récupérer un document, je cherche quelque chose de similaire à insérer:
// Controller
var session = new MongoSession();
var post = session.Single<Post>(c => c.Id == id);
//Repository
public T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class, new()
{
T retval = default(T);
using (var db = Mongo.Create(_connectionString))
{
retval = db.GetCollection<T>().AsQueryable()
.Where(expression).SingleOrDefault();
}
return retval;
}
MISE À JOUR
Notez que l'appel:
_collection.UpdateOne(
new { _id = commentViewModel.Id },
new { Comments = M.AddToSet(comment) }
)
fait ce dont j'ai besoin, je veux juste être en mesure de m Ake un appel générique (par manque d'un meilleur mot) à quelque chose comme ça (à l'exception d'une version de travail):
//Controller
var session = new MongoSession();
session.AddSubDocument<>(new Post { Id = commentViewModel.Id }, new { Comments = M.AddToSet(comment) });
// Repository ==> NOT WORKING SAMPLE
public void AddSubDocument<X, U>(X matchDocument, U valueDocument)
{
using (var db = Mongo.Create(_connectionString))
{
db.GetCollection<X>().UpdateOne(matchDocument, valueDocument);
}
}
espoir qui fait plus de sens.
Merci, Mike
Merci jfar mais cela ne fonctionne que pour l'insertion d'un document, pas l'ajout d'un document incorporé dans un existant. – Mikalee
@Mikalee - C'est probablement impossible sans une réflexion magique. Comment sauriez-vous quel champ ou quelle propriété ajouter le document imbriqué? – jfar
Si vous regardez l'exemple que j'ai donné ci-dessus, cela fonctionne déjà, je ne sais pas comment le rendre générique. Ainsi, en appelant _collection.UpdateOne (new {_id = commentViewModel.Id}, new {Commentaires = M.AddToSet (comment)}); le premier paramètre identifie le document racine et le deuxième paramètre identifie le champ (IList Comments) auquel l'ajouter. La méthode "M.AddToSet" fait ce dont j'ai besoin - j'ajouterai quelques détails à mon article. – Mikalee