Как использовать лямбду для выбора подсписка, используя async в c # Mongodb driver - PullRequest
0 голосов
/ 05 февраля 2019

Я пишу приложение, которое интенсивно использует вложенные списки объектов, и я изо всех сил пытаюсь найти способ получить подсписки, которыми я доволен.

Я довольно новичок в асинхронном программировании и хотел бы сделать что-то вроде следующего, но я не могу придумать способ, не разбив его на два отдельных вызова.Необходимость получить все промежуточные результаты только для того, чтобы отфильтровать их до того, что я хочу после факта, не кажется такой уж эффективной.

baseObj 
{ 
    string ID; 
    string name; 
    List<subObj> subObjList
    {
        string ID; 
        string desc;
        bool deleted;
    }; 
}

Я знаю, что это не работает, но я чувствую, что это что-то маленькое, что я могу изменить, чтобы заставить его работать, но я не знаю, с чего начать.

List<subObj> = await collection.AsQueryable().Where(w=> w.ID == "id").Select(s => s.subObjList.Where(w => w.deleted == false).ToList()).FirstAsync();

Это работает, но я думаю, что это можно сделать более эффективно

baseObj obj = await collection.AsQueryable().Where(w=> w.ID == "id").firstAsync();
List<subObj> sObjList = obj.subObjList.Where(w => w.deleted == false).ToList();

Есть ли способ выбрать подсписок всего за один запрос или это просто невозможно?

1 Ответ

0 голосов
/ 05 февраля 2019

Да, просто используйте SelectMany вместо Select:

List<subObj> sObjList = collection.AsQueryable()
    .Where(w=> w.ID =="id")
    .SelectMany(x => x.subObjList)
    .Where(w => w.deleted == false)
    .ToList();
...