2011-03-14 20 views
1

我想寫一個通用的方法來嵌入一個對象作爲嵌入式文檔。下面的代碼已經可以工作了,但是我需要製作一個通用的方法,可以將其放入存儲庫並從控制器調用。我需要傳入需要插入的根ID和子文檔對象。幫助一個通用的LINQ插入方法(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) } 
     ); 
} 

作爲一個例子,這是我用它來檢索文檔,我正在尋找類似的東西插入:

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

UPDATE

請注意,調用:

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

做我需要什麼,我只是想能夠AKE它通用通話(由於缺乏一個更好的詞),以這樣的事情(除了一個工作版本):

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

這應該工作

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

感謝jfar但只插入一個完整的文件,不加入嵌入文檔到現有的工作之一。 – Mikalee

+0

@Mikalee - 如果沒有一些反思魔術,這可能是不可能的。您如何知道將哪個字段或屬性添加到嵌套文檔? – jfar

+0

如果你看看我上面給出的例子,它已經有效,我只是不知道如何使它通用。因此,通過調用_collection.UpdateOne(new {_id = commentViewModel.Id},new {Comments = M.AddToSet(comment)});第一個參數標識根文檔,第二個參數標識將其添加到哪個(IList註釋)字段。 「M.AddToSet」方法可以滿足我的需求 - 我會在我的文章中添加一些細節。 – Mikalee