Ответ 1
Чтобы присоединиться к нескольким полям в LINQ, вам необходимо создать новый анонимный тип, содержащий столбцы, которые вы хотите сравнить, а затем использовать этот анонимный тип в соединении:
var results = from t1 in context.tb1
join t2 in context.tb2
on new { t1.Col1, t1.Col2, t1.Col3 } equals
new { t2.Col1, t2.Col2, t2.Col3 }
where t2.Col1 == col1 && t2.Col2 == col2 && t2.Col4 == someString
select t1;
И вот эквивалентный синтаксис лямбда:
var results = context.tb1.Join(
context.tb2,
t1 => new { t1.Col1, t1.Col2, t1.Col3 },
t2 => new { t2.Col1, t2.Col2, t2.Col3 },
(t1, t2) => new { t1, t2 })
.Where(o => o.t2.Col1 == col1
&& o.t2.Col2 == col2
&& o.t2.Col4 == someString)
.Select(o => o.t1);
Как вы можете видеть, в случае объединений синтаксис запроса обычно производит более легкое для чтения утверждение.