使用Lambda Expression查询带有ID列表的MongoDB

时间:2013-05-10 12:40:33

标签: c# linq mongodb lambda

我希望有人可以帮助我:

我正在使用界面访问我的数据,Find方法是:

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

我正在尝试构建一个表达式来获取ObjectIds列表中的所有ObjectIds。

像这样的东西: r =&gt; r.id.ContainsAny(LIST_OF_IDS); //其中List_Of_IDs的类型为:List

我也尝试过: r =&gt; r.id.ContainsAny(new [] {id1,id2,id3})//其中id1,id2,id3是ObjectId类型

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

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

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

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

BTW:这是我将表达式发送到存储库方法的地方:

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

1 个答案:

答案 0 :(得分: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));       
}