2013-05-10 219 views
1

我希望有人能帮助我ID列表:MongoDB的查询使用Lambda表达式

我使用一个接口来访问我的数据,查找方法是:

public IQueryable<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new() 
    { 
     return (IQueryable<T>) _db.GetCollection<T>(typeof(T).Name, WriteConcern.Acknowledged).AsQueryable().Where(expression); 
    } 

我m试图构建一个表达式来获取ObjectIds列表中的所有ObjectId。

类似于: r => r.id.ContainsAny(List_Of_IDs); //其中LIST_OF_IDS的类型为:列表

我也尝试: R => r.id.ContainsAny(新[] {ID1,ID2,ID3})//其中ID1,ID2,ID3的类型的ObjectID

但是我得到一个错误,ContainsAny不支持这个参数。

我希望能够在SQL中复制IN语句的功能。我的目标是我希望用户集合包含产品列表作为ObjectId列表,然后查询产品集合并获取用户产品ID列表中的所有文档。

这可能吗?有谁知道我做错了什么?

非常感谢您的帮助! 史蒂夫

BTW:这里是我送的表达式库方法:

public static List<product> getByIDlist(List<ObjectId> IDs) 
    { 
     return (List<product>)repo.Find<product>(r => r.id.ContainsAny(IDs));  
    } 

回答

0

.ContainsAny() is only meant to be used on an array field.。所以你可以使用它,如果你的.id是一个数组类型。

对于你的情况,你正在寻找.Contains().In()

public static List<product> getByIDlist(List<ObjectId> IDs) 
{ 
    return (List<product>) repo.Find<product>(r => IDs.Contains(r.id);  
} 

其中,巧合的是,就相当于:

public static List<product> getByIDlist(List<ObjectId> IDs) 
{ 
    return (List<product>) repo.Find<product>(r => r.id.In(IDs));  
} 
+0

你摇滚!谢谢! 我想我需要写这些lambda表达式,它似乎总是向后比较与SQL。 - 您认为这是实现我获得所有用户产品目标的最快方式吗?这似乎是我试图用非关系数据库创建关系数据? – Steve 2013-05-10 14:25:55

+0

我不认为你的模式设计有什么固有的错误。据我所知,一个'用户'文件有一个产品ID的数组。这里的决定是您是否想要将(重复)额外的产品数据嵌入到“用户”文档中,这会使更新更加复杂,但将查询减少到“产品”集合。 – 2013-05-10 15:01:03

+0

@Steve在这种情况下归结为[嵌入与引用](http://docs.mongodb.org/manual/core/data-modeling/#data-modeling-decisions) – 2013-05-10 15:07:44