2011-03-02 26 views
0

我觉得这样做一定很简单,但无法完成 - 任何帮助将不胜感激。我对LINQ和MongoDB比较陌生。使用LINQ选择嵌入对象(来自MongoDB)

我有以下两个实体:

class ParentObject 
{ 
    GUID ParentId {get;set;} 
    IList<ChildObject> ChildObjects {get;set;} 
    ...other properties 

    ParentObject() 
    { 
     childObjects = new List<ChildObject>(); 
    } 
} 

class ChildObject 
{ 
    GUID ChildId {get;set;} 
    ...other properties 
} 

那我坚持到MongoDB实例(如一个文件,与子文档嵌入)。我需要做的是使用ParentId和ChildId检索存储在ParentObject文档中的一个ChildObject子文档。我几乎没有我想要什么下面的方法/方法调用,但我只能基于索引(0,1等)返回一个IList或一个特定ChildObject:

// I know this won't work  

var parentId = (Some GUID); 
var childId = (Some GUID); 

var result = 
    SingleWithSelect<ParentObject, ChildObject> 
    (
     x => x.Id == parentId && x.ChildObjects.ChildId == ChildId, 
     y => y.ChildObject 
    ); 


public TResult SingleWithSelect<T, TResult>(
    System.Linq.Expressions.Expression<Func<T, bool>> whereExpression, 
    System.Linq.Expressions.Expression<Func<T, TResult>> selectExpression) 
    where T : class, new() 
     { 
      TResult retval = default(TResult); 
      using (var db = Mongo.Create(ConnectionString())) 
      { 
       retval = db.GetCollection<T>().AsQueryable() 
          .Where(whereExpression) 
          .Select(selectExpression) 
          .SingleOrDefault(); 
      } 
      return retval; 

     } 

很多感谢提前任何帮助/指针。

-Mike

+1

只需两步:** 1。**通过parentId加载父级。 ** 2。**从父级获取子级ID:* parent.ChildCollection.Single(x => x.Id == childId); * – 2011-03-02 23:46:13

+0

这样做,在服务器端执行它会更好,但因为它不被支持,这会 - 谢谢。 – Mikalee 2011-03-03 15:50:12

回答

1

这在Mongodb本身当前不支持。在匹配时,整个文档将被返回,而不仅仅是匹配的子文档。我不确定标准是否为此提供支持,并在驱动程序方面提供过滤。 MongoDB上此功能请求的开放JIRA项目是http://jira.mongodb.org/browse/SERVER-828

0

使用map/reduce来检索嵌入文档。