Запрос MongoDB со списком идентификаторов с использованием лямбда-выражения

Я надеюсь, что кто-то может мне помочь:

Я использую интерфейс для доступа к своим данным, метод 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);
    }

Я пытаюсь построить выражение для получения всех ObjectId в списке ObjectId.

что-то вроде: r => r.id.ContainsAny(List_Of_IDs); //где List_Of_IDs имеет тип: Список

Я также пробовал: r => r.id.ContainsAny(new[] {id1, id2, id3}) //где id1, id2, id3 имеют тип ObjectId

Но я получаю сообщение об ошибке, что ContainsAny не поддерживает этот параметр.

Я надеялся дублировать функциональность оператора IN в SQL. Моя цель состоит в том, что я хочу, чтобы пользовательская коллекция содержала список продуктов в виде списка ObjectId, а затем я хочу запросить коллекцию продуктов и получить все документы в пользовательском списке идентификаторов продуктов.

Это возможно? Кто-нибудь знает, что я делаю неправильно?

Большое спасибо за любую помощь! Стив

Кстати: здесь я отправляю выражение в метод репозитория:

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

person Steve    schedule 10.05.2013    source источник


Ответы (1)


.ContainsAny() предназначен только для используется в поле массива.. Таким образом, вы могли бы использовать его, если бы ваш .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));       
}
person Zaid Masud    schedule 10.05.2013
comment
Ты жжешь! Спасибо! Думаю, мне нужно поработать над написанием этих лямбда-выражений, они всегда кажутся обратными по сравнению с SQL. - Как вы думаете, это самый быстрый способ достичь моей цели - получить все продукты пользователя? Кажется, я пытаюсь создать реляционные данные с нереляционной БД? - person Steve; 10.05.2013
comment
Я не думаю, что в вашей схеме есть что-то неправильное. Насколько я понимаю, документ User имеет массив идентификаторов продуктов. Решение здесь заключается в том, хотите ли вы встроить (дублировать) дополнительные данные о продукте в документ User, что сделает обновления более сложными, но сократит количество запросов к коллекции Product. - person Zaid Masud; 10.05.2013
comment
@Steve, в этом случае все сводится к встраиванию и ссылке< /а> - person Zaid Masud; 10.05.2013
comment
Вы мертвы ... Это именно то, о чем я спорю ... Я фактически создал класс мини-продукта для хранения популярных свойств продукта в качестве поддокумента в документе пользователя, чтобы мне не нужно было часто запускать вышеуказанный запрос. .. Идея, как вы сказали, дублировать данные, но меньше запросов/доступа к данным... Но у меня так много лет с SQL, что мне трудно узнать и перепрограммировать мой мозг на передовой подход NOSQL :) Еще раз спасибо за ваш помогите это очень ценится! - person Steve; 10.05.2013