В LINQ2SQL вам редко требуется явное объединение при использовании внутренних объединений.
Если у вас есть правильные отношения внешнего ключа в вашей базе данных, вы автоматически получите отношение в конструкторе LINQ (если нет, вы можете создать отношениевручную в конструкторе, хотя у вас действительно должны быть правильные отношения в вашей базе данных)
Тогда вы можете просто получить доступ к связанным таблицам с помощью "точечной нотации"
var q = from child in context.Childs
where child.Parent.col2 == 4
select new
{
childCol1 = child.col1,
parentCol1 = child.Parent.col1,
};
сгенерирует запрос
SELECT [t0].[col1] AS [childCol1], [t1].[col1] AS [parentCol1]
FROM [dbo].[Child] AS [t0]
INNER JOIN [dbo].[Parent] AS [t1] ON ([t1].[col1] = [t0].[col1]) AND ([t1].[col2] = [t0].[col2])
WHERE [t1].[col2] = @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [4]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
На мой взгляд, это гораздо более читабельно и позволяет вам сконцентрироваться на ваших особых условиях, а не на реальной механике соединения.
Редактировать
Это, конечно, применимо, только если вы хотите присоединиться в соответствии с нашей моделью базы данных.Если вы хотите присоединиться «за пределами модели», вам нужно прибегнуть к ручному объединению, как в ответе из Квинтин Робинсон