Извършване на заявка към 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);
    }

Опитвам се да създам израз за извличане на всички ObjectIds в списък с ObjectIds.

нещо като: r => r.id.ContainsAny(List_Of_IDs); // където List_Of_IDs е от тип: List

Опитах също: r => r.id.ContainsAny(new[] {id1, id2, id3}) //където id1, id2, id3 са тип ObjectId

Но получавам грешка, че ContainsAny не поддържа този параметър.

Надявах се да дублирам функционалността на оператор IN в SQL. Моята цел е, че искам потребителската колекция да съдържа списък с продукти като списък с ObjectIds и след това искам да направя запитване до колекцията от продукти и да получа всички документи в списъка на потребителя с идентификатори на продукти.

Това възможно ли е? Някой знае ли какво правя погрешно?

Благодаря много за всяка помощ! Стив

BTW: тук изпращам израза към метода на хранилището:

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. – Смятате ли, че това е най-бързият начин да постигна целта си да получа всички продукти на потребителя? Изглежда, че се опитвам да създам релационни данни с нерелационна DB? - 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