#sql #linq #entity-framework-core #left-join
#sql #linq #entity-framework-core #левое соединение
Вопрос:
Я очень новичок в SQL / LINQ и действительно мог бы воспользоваться вашей помощью.
У меня есть 3 таблицы:
Таблица приглашений
| InviteId | Name | Email | SalesAgentId | |
|----------|----------|--------------|--------------|---|
| 9 | John Doe | john@doe.com | 1 | |
Таблица SalesAgent
| SalesAgentId | UserId | Active |
|--------------|--------|--------------|
| 1 | 2 | true |
Пользовательская таблица
| UserId | Name | Email |
|--------|--------------------------------------|-----------------------------------|
| 2 | Sales Guy | sales@agent.com |
Попытка сгенерировать список данного торгового агента, который должен содержать информацию об этом торговом агенте вместе с информацией о пользователе, который был приглашен торговым агентом (из таблицы приглашений)
Цель: попытка получить список пользователей (как из таблицы приглашений, так и из таблицы пользователей, которые привязаны к идентификатору SalesAgent (либо пользователь сам является агентом по продажам, либо пользователь был приглашен агентом по продажам).).
Итак, в этом сценарии цель состоит в том, чтобы получить результирующую таблицу (результат) в виде:
ResultId: если в таблице User есть запись, используйте SalesAgentId, но если запись поступает из таблицы Invitation, используйте InviteId для этого столбца.
Имя / адрес электронной почты: та же логика; если запись находится в таблице пользователей, используйте имя / адрес электронной почты из таблицы пользователей, если нет, то используйте информацию из таблицы приглашений.
InvitedUser: если запись находится в таблице User, то это должно быть false, но если она поступает из таблицы Invitation, то это должно быть true.
| ResultId | Name | Email | InvitedUser |
|----------|-----------|-----------------|-------------|
| 1 | Sales Guy | sales@agent.com | false |
| 9 | John Doe | john@doe.com | true |
Я не уверен, какое соединение помогло бы мне в этом сценарии, более или менее мне нужно объединить результаты из 2 запросов (я думаю). Конечная цель — получить версию запроса linq для этого выбора, но я думаю, что LINQ / EFCore не поддерживает объединение при использовании разных хранилищ данных.
Я был бы очень признателен за любую помощь или указатель в правильном направлении; заранее большое спасибо.
Комментарии:
1. Вам нужен отфильтрованный список для определенного агента и только приглашенных, связанных с этим агентом?
2. Вероятно, следует предоставить большую выборку данных, включая случай, когда пользователь также является приглашенным. Джон Доу не является пользователем? Вывод, который вы показываете, выглядит как результат запроса ОБЪЕДИНЕНИЯ.
Ответ №1:
Вывод, который вы показываете, выглядит как результат запроса ОБЪЕДИНЕНИЯ, поэтому рассмотрите:
SELECT Invitation.InviteID AS ResultID, Invitation.Name, Invitation.Email, True AS InvitedUser
FROM Invitation
UNION
SELECT SalesAgent.SalesAgentID, User.Name, User.Email, False AS InvitedUser
FROM [User] INNER JOIN SalesAgent ON User.UserID = SalesAgent.UserID
WHERE (((User.Name) Not In (SELECT [Name] FROM [Invitation])));