Я пытаюсь выяснить, как сделать смешанное соединение в LINQ с определенным доступом к 2 объектам LINQ. Вот пример того, как может выглядеть фактический запрос TSQL:
SELECT
*
FROM
[User] AS [a]
INNER JOIN
[GroupUser] AS [b]
ON
[a].[UserID] = [b].[UserID]
INNER JOIN
[Group] AS [c]
ON
[b].[GroupID] = [c].[GroupID]
LEFT JOIN
[GroupEntries] AS [d]
ON
[a].[GroupID] = [d].[GroupID]
WHERE [a].[UserID] = @UserID
В конце я бы хотел перечислить объект, полный объектов GroupEntry. Что меня интересует, так это последние две таблицы / объекты в этом запросе. Я буду отображать группы как заголовок группы, а все записи под заголовком их группы. Если для группы нет записей, я все еще хочу видеть эту группу в качестве заголовка без каких-либо записей. Вот что у меня есть:
Итак, из этого я хотел бы сделать функцию:
public void DisplayEntriesByUser(int user_id)
{
MyDataContext db = new MyDataContext();
IEnumberable<GroupEntries> entries =
(
from user in db.Users
where user.UserID == user_id
join group_user in db.GroupUsers
on user.UserID = group_user.UserID
into a
from join1 in a
join group in db.Groups
on join1.GroupID equals group.GroupID
into b
from join2 in b
join entry in db.Entries.DefaultIfEmpty()
on join2.GroupID equals entry.GroupID
select entry
);
Group last_group_id = 0;
foreach(GroupEntry entry in entries)
{
if (last_group_id == 0 || entry.GroupID != last_group_id)
{
last_group_id = entry.GroupID;
System.Console.WriteLine("---{0}---", entry.Group.GroupName.ToString().ToUpper());
}
if (entry.EntryID)
{
System.Console.WriteLine(" {0}: {1}", entry.Title, entry.Text);
}
}
}
Пример выше работает не совсем так, как ожидалось. Есть 2 проблемы, которые мне не удалось решить:
Мне все еще кажется, что я получаю ВНУТРЕННЕЕ СОЕДИНЕНИЕ вместо ЛЕВОГО СОЕДИНЕНИЯ при последнем соединении. Я не получаю пустых результатов, поэтому группы без записей не отображаются.
Мне нужно найти способ, чтобы я мог заполнить значения по умолчанию для пустых наборов записей. То есть, если есть группа без записи, я хотел бы получить в основном пустую запись, за исключением того, что я бы хотел, чтобы EntryID был нулевым или 0, а GroupID - идентификатором пустой группы, которую она представляет. и мне понадобится дескриптор объекта entry.Group (т. е. его родитель, пустой объект Group).
Любая помощь по этому вопросу будет принята с благодарностью.
Примечание: имена таблиц и представление в реальном мире были получены исключительно для этого примера, но их отношения упрощают то, что я пытаюсь сделать.