Linq-to-Entities: LEFT OUTER JOIN с предложением WHERE, расчет и проекция

Мне очень трудно понять, как перевести простое SQL LEFT OUTER JOIN на несколько столбцов и предложение where в рабочий запрос Linq-to-Entities. Есть только две таблицы. Мне нужны значения для всех строк из Table1, независимо от совпадений в Table2, но объединение нескольких столбцов оказывается трудным. Мне также нужно сделать простой расчет в запросе, но могуНе могу найти это тоже. Запрос в SQL будет выглядеть так:

select t1.tableid1,
t1.tableid2,
t1.fieldvalue1,
t2.fieldvalue2,
isnull(t2.fieldvalue2,0) / t1.fieldvalue1 as calcvalue
t1.fieldvalue1 - isnull(t2.fieldvalue2,0) as calcvalue2
from table1 t1
left outer join table2 t2 
    on t1.tableid1 = t2.tableid1
    and t1.tableid2 = t2.tableid2
    and t1.tableid3 = t2.tableid3
where t1.tableid1 = @somevalue

Я могу сделать одно соединение слева, но я могуПохоже, что он нашел правильный синтаксис для нескольких столбцов, не говоря уже о том, что он не знает, как добавить или вычесть значения в столбце. Ниже мое лучшее предположение, но яполучаю ошибку ожидаемого типа (после "новый» и перед первой открывающей скобкой) для:

On New (t2.Field(Of String)("tableid1"), t2.Field(Of String)

Лучшая догадка:

Dim query = From t1 In dtTable1 _
                         Group Join t2 In dtTable2 _
                         On New (t2.Field(Of String)("tableid1"), t2.Field(Of String)("tableid2")) Equals _
                            (t1.Field(Of String)("tableid1"), t1.Field(Of String)("tableid2")) _
                         Into t2outer = Group _
                         From t2 In t2outer.DefaultIfEmpty() _
                         Select New With _
                        { _
                            .t1_tableid1 = t1.Field(Of String)("tableid1"), _
                            .t1_tableid2 = t1.Field(Of String)("tableid2"), _
                            .t1_fieldvalue1 = t1.Field(Of Integer)("fieldvalue1"))
                            .t2_fieldvalue2 = If(t2 Is Nothing, CType("0", Integer), t2.Field(Of Integer)("fieldvalue2"))
                        }

@Gert Это подобрало меня достаточно близко. Я думаю, что форматирование было немного отключено, так как я должен был добавить фигурные скобки, а не круглые скобки, и он поместил пробел между "Ключ» Ключевое слово и идентификатор:

On New With {
                        Key .id1 = t2.Field(Of String)("tableid1"), _
                        Key .id2 = t2.Field(Of String)("tableid2")
                        } _
                    Equals _
                    New With {
                        Key .id1 = t1.Field(Of String)("tableid1"), _
                        Key .id2 = t1.Field(Of String)("tableid2")
                        } _

Благодаря Герту я смог заставить это работать, как описано в запросе SQL. Ниже показано, какое должно быть полное рабочее представление SQL-запроса:

Dim query = From t1 In dtTable1 _
    Where (T1.Field(Of String)("fieldvalue1") = SOMEVALUE) _
     Group Join t2 In dtTable2 _
     On New (t2.Field(Of String)("tableid1"), t2.Field(Of String)("tableid2")) Equals _
        (t1.Field(Of String)("tableid1"), t1.Field(Of String)("tableid2")) _
     Into t2outer = Group _
     From t2 In t2outer.DefaultIfEmpty() _
     Select New With _
    { _
        .t1_tableid1 = t1.Field(Of String)("tableid1"), _
        .t1_tableid2 = t1.Field(Of String)("tableid2"), _
        .t1_fieldvalue1 = t1.Field(Of Integer)("fieldvalue1"))
        .t2_fieldvalue2 = If(t2 Is Nothing, CType("0", Integer), t2.Field(Of Integer)("fieldvalue2"))
        .calcvalue = If(t2.Field(Of Integer)("fieldvalue2") Is Nothing, CType("0", Integer), t2.Field(Of Integer)("fieldvalue2")) _
            / CType(t1.Field(Of String)("fieldvalue1"), Integer), 
        .calcvalue2 = CType(t1.Field(Of String)("fieldvalue1"), Integer) _
            - If(t2.Field(Of Integer)("fieldvalue2") Is Nothing, CType("0", Integer), t2.Field(Of Integer)("fieldvalue2")) _
    }

Ответы на вопрос(2)

Ваш ответ на вопрос