Существует перегрузка расширения Select, которое также предоставляет индекс ( MSDN )
var combine = dict1.Union(dict2)
.GroupBy(kvp => kvp.Key)
.Select((grp,index) => new { Key = grp.Key, Value = new Test { Number = index+1, Name = grp.First().Name}})
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
Это - вопрос вкуса, но мне нравится ключевое слово СОЕДИНЕНИЯ лучше. Это делает логику более ясной и более согласовывается с ЛЕВЫМ синтаксисом ВНЕШНЕГО ОБЪЕДИНЕНИЯ, который идет с ним. Обратите внимание, что можно также использовать ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ, которое синонимично с СОЕДИНЕНИЕМ.
Синтаксис
a JOIN b
ON expression relating b to all of the tables before
b может быть самим соединением. Для внутренних объединений это не имеет значения, но для внешнего можно управлять порядком соединений как это:
select * from
a left join
d join c
on d.i = c.i
on a.k = d.k
Здесь лево-присоединенного к внутреннему объединению между d и c.
Вот Ваш запрос:
select *
from tbA A
join tbB B on A.ID = B.ID
join tbC C on B.ID2 = C.ID2
join tbD D on A.ID = D.ID and C.ID3 = D.ID3 and B.ID4 = D.ID4
where
A.Foo='Foo'
SELECT *
FROM tba AS a
JOIN tbb AS b ON a.id = b.id
JOIN tbc AS c ON b.id2 = c.id2
JOIN tbd AS d ON a.id = d.id AND c.id3 = d.id3 AND b.id4 = d.id4
WHERE
a.foo = 'Foo'
Хотя мне нелегко воображать любую потребность в этом. Пустой для предоставления примера или а более описательных имен таблиц?
JOIN
синтаксис является более четким (хотя я лично предпочитаю WHERE
синтаксис в простых случаях), и, то, которое более важно, может обработать INNER
и OUTER
участвует в более ясном пути.
WHERE
не удерживается от использования и вероятно никогда не будет.
Это удержало от использования только в некотором смысле настолько отличающийся OUTER JOIN
обходные решения (как (*)
и (+)
) удерживаются от использования.
Нет ничего, с чем Вы не можете сделать JOIN
то, что можно сделать с WHERE
, но не наоборот.
Я нахожу синтаксис соединения намного легче понять
select *
from tbA A
inner join tbB B on a.id = b.id
inner join tbC C on b.id2 = c.id2
inner join tbD D on a.id = d.id and c.id3 = d.id3 and b.id4 = d.id4
where A.Foo='Foo'
Теперь можно ясно видеть, как объединены данные и что это не очень сложное соединение в целом.
BTW, проектирование баз данных в Вашем примере сильно пахнет недостающей нормализацией. Обычно у Вас должна быть любая одна таблица, соединяющая со многими (соединение b на a.bid = b.bid присоединяются к c на a.cid = c.cid), или цепочка (соединение b на a.bid = b.bid присоединяются к c на b.cid = c.cid).
Править. Добавленное дополнительное ключевое слово, ВНУТРЕННЕЕ, который не изменяет результат, но делает его более ясным.