ddgjgj Ответов: 1

Запрос соединения между тремя таблицами


У меня есть три таблицы базы данных Northwind, Employee (employeeID) 1-* Order(Orderid,customerid,employeeid)*-1 Customer(customerID). 1 сотрудник имеет много заказов , а 1 клиент имеет много заказов , так что это отношения 1* *1, с таблицей заказов посередине. Итак, как мне извлечь и отобразить в MVC-представлении всех сотрудников, у которых есть клиенты ?

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

я только что объяснил эту проблему выше

Maciej Los

Хорошо, вы объяснили, но что вы пробовали?

1 Ответов

Рейтинг:
8

CHill60

Во-первых, в моей копии базы данных Northwind, загруженной непосредственно из MSDN, таблицы называются Employees, Orders и Customers Важно быть точным.

Таблицы могут быть запрошены с помощью соединений - эта статья CodeProject объясняет различные типы соединений Визуальное представление SQL-соединений[^]

Потому что вы пытаетесь предел возвращенная информация - "все сотрудники, у которых есть клиенты" подразумевает "не показывайте сотрудников, у которых есть клиенты". нет есть клиенты", Ан INNER JOIN было бы уместно-обратитесь к статье, чтобы узнать почему.
На самом деле вам не нужно объединять все три таблицы, потому что если вы посмотрите на сценарий создания заказов таблиц, то увидите

...
[CustomerID] [nchar](5) NULL,
...
ALTER TABLE [dbo].[Orders]  WITH NOCHECK ADD  CONSTRAINT [FK_Orders_Customers] FOREIGN KEY([CustomerID])
REFERENCES [dbo].[Customers] ([CustomerID])
GO
ALTER TABLE [dbo].[Orders] CHECK CONSTRAINT [FK_Orders_Customers]
GO
(В SQL Server Management Studio, Если вы щелкните правой кнопкой мыши на имени таблицы в окне обозревателя объектов, выберите "Script table as", затем "CREATE to", а затем "New Query Editor Window", вы можете получить информацию, вставленную выше).
Это в основном означает, что если вы включаете значение для CustomerID на Orders стол потом он должен существуют как CustomerID на Customers таблица, в противном случае этот столбец будет содержать NULL.

Итак, чтобы просто перечислить сведения о сотрудниках, которые появляются в таблице заказов:
Select E.LastName, E.FirstName, E.Title
FROM Orders O
INNER JOIN Employees E ON O.EmployeeID = E.EmployeeID
WHERE CustomerID IS NOT NULL
Это происходит точно так же, как и включение Customers на другой INNER JOIN т.е.
Select E.LastName, E.FirstName, E.Title
FROM Orders O
INNER JOIN Employees E ON O.EmployeeID = E.EmployeeID
INNER JOIN Customers C ON O.CustomerID = C.CustomerID
Опять же, если вы посмотрите на изображения в этой статье, вам станет ясно, почему.

Перевод этого на MVC, Linq или что-то еще, что вы пытаетесь сделать, остается для вас упражнением, поскольку вы не предоставили мне достаточно информации (и усилий), чтобы помочь вам в этом.


ddgjgj

Во-первых, мы предполагаем, что у каждого заказа есть клиент, поэтому, если у сотрудника есть заказ, у него также должен быть клиент. Таким образом, мы можем забыть о клиентском столе. Мы действительно просто хотим знать, какие сотрудники имеют заказы. Для этого мы просматриваем заказы и собираем список сотрудников, которые ими владеют:

(от О в приказах
выберите o.Работника).Отчетливый()

Так что это часть того, как выглядит вид:

@модель Нортвинд.Работники

@{
Видовая сумка.Title = " Я";
Layout = " ~ / Views / Shared/MasterDetailsLayoutPage.cshtml";
}








@HTML-код.DisplayNameFor(модель =&ГТ; модель.столбец EmployeeID)



@HTML-код.DisplayFor(модель =&ГТ; модель.столбец EmployeeID)

........И НЕКОТОРЫЕ ДРУГИЕ СОТРУДНИКИ ПОЛЯ....
Тогда вот выведите таблицу:
foreach(элемент в модели.Клиенты)

..... отобразите таблицу клиентов для этого сотрудника(пример EMPLOYEEID: 5).



А это контролер :

dbNorthwindEntities db = новые dbNorthwindEntities();

// GET: тест
/* public ActionResult Details()
{
// запрос приходит сюда
возвращение смотреть();
}*/


Можете ли вы поправить меня или помочь мне с этим сейчас ? Я действительно очень ценю ваше объяснение выше, я был как "вау"!

CHill60

Запрос будет более простым

Select E.LastName, E.FirstName, E.Title --,and some other employees fields
FROM Orders O
INNER JOIN Employees E ON O.EmployeeID = E.EmployeeID
.. и этот запрос должен идти в модель, а не в контроллер.
Честно говоря, большинство примеров в Интернете, похоже, используют Linq to Sql или Entity Framework, но я нашел этот простой пример для вас c# - использование простых запросов в ASP.NET MVC-переполнение стека[^] и есть также некоторые рекомендуемые чтения по этой ссылке - Как я могу подключиться к SQL MVC на сервере и использовать его как C# добавление, редактирование, удаление и выберите | форумах ASP.NET [^]
Теперь я должен объяснить, что MVC не является моей областью знаний, поэтому, если у вас все еще есть проблемы, возможно, стоит поднять новый вопрос...убедитесь, что вы включили код из своего комментария

ddgjgj

Большое вам спасибо, Мистер гений ! Я действительно очень ценю каждый ответ, который вы написали .