WedX - журнал о программировании и компьютерных науках

linq selectmany сглаживает несколько уровней

У меня есть следующее отношение (например)

A содержит один или несколько B

Каждый B содержит один или несколько C и D

Я хочу сгладить все с помощью SelectMany вместе с некоторыми условиями поиска и получить A, B, C и D. Это то, что у меня есть.

context.A.Where(a => (string.IsNullOrEmpty(name) || a.Name.Contains(name)))
    .SelectMany(ab =>ab.b.Where(n=>n.bname.Contains(name) || string.IsNullOrEmpty(name)),     
    (aa, bb) => new { aa, bb })   //gets all a's and b's
    .SelectMany(bc => bb.c.Where(w => w.KEYWORD.Contains(Keyword) || string.IsNullOrEmpty(Keyword)),
    (bc,words) => new {bc,kwords})  //gets all b's and c's

Правильно ли я делаю? Если да, то как получить B вместе со всеми D, добавляющими к приведенному выше выражению?

24.10.2016

  • Я бы предложил вам использовать синтаксис запроса в таких сценариях. 24.10.2016

Ответы:


1

Соглашаясь с тем, что предложил Иван, вы можете сгладить эту трехуровневую глубокую структуру следующим образом:

var query = (from a in A
             from b in (List<dynamic>)a.b
             from c in (List<dynamic>)b.c
             from d in (List<dynamic>)b.d
             select new { a, b, c, d });

if (!string.IsNullOrEmpty(name))
{
    query = query.Where(record => record.b.bname.Contains(name));
}

if (!string.IsNullOrEmpty(keyword))
{
    query = query.Where(record => record.c.keyword.Contains(keyword));
}

var result = query.ToList();

Вы также можете добавить предложения where в запрос вверху, но, видя, что вы проверяете, получили ли вы какие-либо действительные входные данные, я бы поместил их после

Протестировал его с этими примерами данных:

List<dynamic> A = new List<dynamic>
{
    new { b = new List<dynamic> { new { bname = "a", c = new List<dynamic> { new { keyword = "b" } }, d = new List<dynamic> { 1, 2, 3 } } } },
    new { b = new List<dynamic> { new { bname = "a", c = new List<dynamic> { new { keyword = "d" } }, d = new List<dynamic> { 1, 2, 3 } } } }
};

string name = "a";
string keyword = "b";
24.10.2016
  • Мой уровень не 4 уровня в глубину... A->B->C и D Как мне тогда реструктурировать ваш запрос? 24.10.2016
  • пример. Команда(A) состоит из TeamMembers(B). Каждый TeamMember(B) может иметь несколько навыков(C) и быть связанным с несколькими проектами(D) 24.10.2016
  • Ваш запрос кажется намного проще, чем использование лямбда.. позвольте мне попробовать это Спасибо! 24.10.2016
  • @cableload - дайте мне знать, как это происходит :) Кстати, в следующий раз это будет проще и привлечет больше людей, чтобы помочь вам, если вы объясните структуру и предоставите некоторые образцы данных (например, тестовые данные, которые я добавил в конце вопрос) 24.10.2016
  • У меня есть еще один короткий вопрос. Если у меня есть другой вызов таблицы V, структура которого (id, value) и связана с отношением d.id, как я добавлю это к приведенному выше запросу? (очевидно, мне нужно присоединиться к D и V) 24.10.2016
  • @cableload - просто добавьте соединение перед select :) Посмотрите документацию SO linq по соединениям - она ​​короткая и хорошая 24.10.2016
  • как показать полученный анонимный тип new {a,b,c,d} в модели представления? Какого типа должна быть эта модель представления? 24.10.2016
  • @cableload - это дополнительный вопрос, и я не должен отвечать на него как часть этого вопроса. К этому есть вопросы. Я ответил на такой вопрос в последние пару дней. Проверьте здесь или многие другие вопросы :) 24.10.2016
  • Я согласен. это немного сложнее, чем я себе представлял. Спасибо за вашу помощь! 24.10.2016

  • 2

    Выбор данных с использованием лямбда-синтаксиса:

    var flatData = context.A.SelectMany(a => a.B.SelectMany(b => b.Select(new {a,b,c = b.C,d = b.D})
    

    Идя дальше, перед применением пункта Where должны быть выполнены следующие проверки, поскольку они проверяют введенные константы, name и keyword.

    1. string.IsNullOrEmpty(name)
    2. string.IsNullOrEmpty(keyword)

    Остальные проверки будут простыми:

    if(!string.IsNullOrEmpty(name))
        flatData  = flatData.Where(data => data.a.Name.Contains(name))
                            .Where(data => data.b.Name.Contains(name));
    
    if(!string.IsNullOrEmpty(keyword))
       flatData  = flatData.Where(data => data.c.Keyword.Contains(keyword));
    

    Важные моменты:

    • flatData выше имеет каскадный фильтр, сначала на a.Name, b.Name and c.Keyword
    24.10.2016
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]