Я использую Linq с Entity Framework 5 и использую синтаксис запроса (думаю, исправьте мою терминологию). У меня есть таблица участников, и я хочу связать их идентификационный номер исследования с зарегистрированным SMS-сообщением, где номер «кому» или «от» в сообщении соответствует номеру телефона участника. Кроме того, я хочу, чтобы сообщения, отправленные с (или на) неизвестного номера, также отображались в списке, и в этом случае идентификационный номер исследования будет нулевым.
Вот рабочий необработанный запрос для LEFT JOIN (с использованием базы данных MySQL, если это имеет значение):
SELECT
messages._id, participants.study_id_number, messages.ts,
messages.from_phone, messages.to_phone, messages.body
FROM messages LEFT JOIN
participants ON ( (participants.phone_number = messages.to_phone)
|| (participants.phone_number = messages.from_phone))
ORDER BY messages.ts DESC;
Вот что я до сих пор работаю в Linq, но это внутреннее соединение:
var loggedMessages = from pp in theDb.participants
let phone = pp.phone_number
from mm in theDb.messages
let fromPhone = mm.from_phone
let toPhone = mm.to_phone
where ((phone == fromPhone) || (phone == toPhone))
orderby mm.ts descending
select new MessageLogEntry()
{
ParticipantId = pp.study_id_number,
TimeStamp = mm.ts,
FromPhone = fromPhone,
ToPhone = toPhone,
Body = mm.body
};
Я новичок в этом, поэтому я был бы рад получить ссылку на учебник по запросам Linq, но что мне нужно добавить, чтобы сделать его ЛЕВЫМ СОЕДИНЕНИЕМ?
РЕДАКТИРОВАТЬ: Пожалуйста, смотрите мой собственный ответ ниже.