Заполнить выбранный список из другого выбранного списка в одном представлении

#c# #asp.net-mvc #entity-framework #linq #model-view-controller

#c# #asp.net-mvc #entity-framework #linq #модель-представление-контроллер

Вопрос:

У меня есть база данных с такими отношениями: 1 проект может иметь много ссылок. У 1 Ссылки может быть много Datei.

Я пытаюсь заполнить список 2 на странице просмотра (редактировать проект). Первый список — это ссылка :-

  ViewBag.referenz = new SelectList(db.FileRefObj.Where(x => x.ProjectId == id).ToList(), "FileReferenz", "FileReferenz");
 

Как мне заполнить список Datei, где он должен содержать список, в котором ReferenzId существует в первом списке?

 ViewBag.datei = new SelectList(db.DateiObj.Where(x => x.ReferenzId == ?? ).ToList(), "DateiName", "DateiName");
 

Ответ №1:

Для этой цели вы можете использовать метод Any() из класса List<T> . Как задокументировано:

Определяет, удовлетворяет ли какой-либо элемент последовательности условию.

Возвращает: True, если какие-либо элементы в исходной последовательности проходят проверку в указанном предикате; в противном случае False.

С учетом сказанного, я бы сначала кэшировал ваш список как List, а не SelectList:

 var referenzList = db.FileRefObj.Where(x => x.ProjectId == id).ToList();
ViewBag.referenz = new SelectList(referenzList, "FileReferenz", "FileReferenz");
 

Тогда я бы Any() вместо этого выбрался из первого кэшированного списка, вот так:

 var dateiList = db.DateiObj.Where(x => referenzList.Any(y => y.ReferenzId == x.ReferenzId)).ToList();
ViewBag.datei = new SelectList(dateiList, "DateiName", "DateiName");
 

Ответ №2:

Я могу предложить несколько способов:

На стороне сервера

 var fileReferenz = db.FileRefObj.Where(x => x.ProjectId == id);

ViewBag.referenz = new SelectList(fileReferenz, "FileReferenz", "FileReferenz");

var datei = db.DateiObj
    .Where(x => fileReferenz.Select(r => r.ReferenzId).Contains(r => x.ReferenzId == r);

ViewBag.datei = new SelectList(datei, "DateiName", "DateiName");
 

Смешанный

Разница здесь в том, что мы извлекаем FileRefObj клиенту и используем идентификаторы для фильтрации.

 var fileReferenz = db.FileRefObj.Where(x => x.ProjectId == id).ToList();

ViewBag.referenz = new SelectList(fileReferenz, "FileReferenz", "FileReferenz");

var datei = db.DateiObj
    .Where(x => fileReferenz.Select(r => r.ReferenzId).Contains(r => x.ReferenzId == r);

ViewBag.datei = new SelectList(datei, "DateiName", "DateiName");
 

Используя Include

 var fileReferenz = db.FileRefObj
   .Include(x => x.Datei)
   .Where(x => x.ProjectId == id)
   .ToList();

ViewBag.referenz = new SelectList(fileReferenz, "FileReferenz", "FileReferenz");

var datei = fileReferenz.SelectMany(x => x.Datei);

ViewBag.datei = new SelectList(datei, "DateiName", "DateiName");