2013-05-10 260 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