#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");