AleLo2014 Ответов: 2

Mvc выберите данные второй таблицы с помощью linq


Привет, я новичок в mvc и linq. У меня есть 2 таблицы по отношению многие ко многим: 1)сотрудник 2)устройство
Выбирая сотрудника я хотел бы посмотреть его устройства:

-Марко -Франко
При выборе Marco должны появиться устройства, связанные с ним.


В sql я бы хотел вот что:
выберите Devices.nome из списка устройств, где Devices.id IN(выберите DeviceID из ImpiegatoDevices, где impiegatiID=id);




Что же мне делать?

Ниже моего кода

Спасибо

Эль

Что я уже пробовал:

Мой код (не работает):

Контроллер:
public ActionResult VediDevice(int id)
{
    Impiegato impi = new Impiegato();

    List<Device> ListDevice = new List<Device>(); 

    using (DatabaseMVCCOntrolsEntities db = new DatabaseMVCCOntrolsEntities())
    {
        ListDevice= db.Devices.Where(u => db.ImpiegatiDevice.Any(m => m.impiegatiID == id)).ToList();  //<---???

        //or

        ListDevice= db.Devices.ToList().Where(u => u.item.Any(m => m.impiegatiID == id)).ToList();   //<---????

    }

    return View(ListDevice);
}

Класс устройства, добавил Я:
List<ImpiegatiDevice> item{get;set;}


VediDevice.cshtml по:
@model List<mvccontroltoolkit.models.device>
@{
    ViewBag.Title = "VediDevice";
}

@foreach (var item in Model)
{
}

<table class="table table-striped  table-condensed">
<tbody>
<tr>
    <th>NOME</th>
</tr>
<tr>
    <td>@Html.DisplayFor(modelItem => item.nome)</td>
</tr>
</tbody>
</table>

Не работать.

Что же мне делать?

Спасибо

Эль

Mehul M Thakkar

Что не работает? вы получили какую-нибудь ошибку?

AleLo2014

использование ListDevice = db.Devices.Вызова метода toList().Где(u => u.itemma.Любой(m => m.impiegatiID == id)).Список();
я получаю эту ошибку:
Система.ArgumentNullException: 'Il valore non può essere null.
Ном параметро: источник'

Mehul M Thakkar

Он говорит имя параметра: источник, это означает, что устройства, которые вы извлекаете, являются нулевыми. сначала проверьте БД.устройства.ToList() имеет значение null, то не применяется предложение Where.

AleLo2014

В sql я бы хотел вот что:
выберите Devices.nome из списка устройств, где Devices.id IN(select DeviceID from ImpiegatoDevices where ImpiegatoDevices.impiegatiID=id);

Mehul M Thakkar

сначала вы выполняете ListDevice = db.Devices.ToList(); и посмотрите, что вы получаете в ListDevice.

AleLo2014

Выполнение ListDevice = db.Devices.Список();
Я получаю все устройства

2 Ответов

Рейтинг:
7

AleLo2014

Фил нашел решение (спасибо тебе, Мутч!!!):
ListDevice = db.Devices.Где(u => u.ImpiegatiDevices.Любой(m => m.impiegatiID == id)).Список();


Рейтинг:
18

phil.o

Я совершенно сбит с толку, так как для отношений "многие ко многим" вам нужен третий стол.

-- SQL pseudocode

TABLE Employee
(
   EmployeeId int PRIMARY KEY IDENTITY,
   EmployeeName nvarchar
)

TABLE Device
(
   DevideId int PRIMARY KEY IDENTITY,
   DeviceName nvarchar
)

TABLE EmployeeDevice
(
   EmployeeId int FOREIGN KEY REFERENCES (Employee.EmployeeId),
   DeviceId int FOREIGN KEY REFERENCES (Device.DeviceId)
)
То EmployeeDevice таблица представляет отношение "многие ко многим". Затем, если вы хотите, чтобы все устройства были связаны с Marco, вы можете написать
SELECT
  d.DeviceId
 ,d.DeviceName
FROM Device d
INNER JOIN EmployeeDevice ed on ed.DeviceId = d.DeviceId
INNER JOIN Employee e on e.EmployeeId = ed.EmployeeId
WHERE e.EmployeeName = N'Marco'
Затем в Linq:
List<Device> devices = context.Devices.Where
(
   d => d.DeviceEmployees.Any
   (
      de => de.Employee.EmployeeName.Equals("Marco")
   )
);


AleLo2014

Я начал с базы данных, а не с кода.

У меня есть идентификатор сотрудника, поэтому я могу выполнить подзапрос или присоединиться к таблице 2:
Устройства и ImpiegatiDevice.

Я писал, но не работал:
ListDevice= db.Devices.Где(u => db.ImpiegatiDevice.Любой(m => m.impiegatiID == id)).Список();

phil.o

Извините, "не работает" - это недостаточно точно.
Может быть

ListDevice = db.Devices.Where(u => u.ImpiegatiDevices.Any(m => m.impiegatiID == id)).ToList();

Все, что я могу видеть, это то, что вы не используете u переменная в вашем подзапросе.

AleLo2014

Привет, Фил, это работа!!!!!!!! спасибо тебе, Мутч!!!!!!!!!!

phil.o

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

AleLo2014

Конечно, но как я могу это сделать? :-). Я не могу найти пуговицу.
Извини, я просто болван.

AleLo2014

я принял "решение 2"

phil.o

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

AleLo2014

Итак, здесь есть все с самого начала. Еще раз спасибо тебе, Фил!

phil.o

Добро пожаловать :)