帮助使用通用的LINQ插入方法(Norm / MongoDB)

时间:2011-03-14 16:44:51

标签: .net linq mongodb norm

我正在尝试编写一个通用方法来将对象插入为嵌入式文档。下面的代码已经可以工作但是我需要创建一个可以放在存储库中并从控制器调用的泛型方法。我需要传入根ID和需要插入的子文档对象。

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) }
        );
}

例如,这是我用来检索文档的内容,我正在寻找类似于insert的内容:

// 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;
}

更新

请注意:

_collection.UpdateOne(
            new { _id = commentViewModel.Id },
            new { Comments = M.AddToSet(comment) }
            )

做我需要的东西,我只是想让它成为通用调用(缺少一个更好的词)到这样的东西(除了工作版本):

//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);
    }
}

希望更有意义。

谢谢你, 麦克

1 个答案:

答案 0 :(得分:1)

这应该有效

public void Insert<T>( T entity )
{
     using (var db = Mongo.Create(_connectionString))
     {
         var collection = db.GetCollection<T>();
         collection.Save( entity );
     }
}