C#の仕様なのかLINQの仕様なのかわからんけど
↓これだと数量[i]が取得出来ないのに

for (int i = 0; i < 5; i++) {
  q[i] = from a in q1
  select new {
    商品 = a.商品,
    数量 = a.数量[i]
  };
  q2 = q2.Concat(q[i]);
}

↓こうやって一旦別の変数に入れると取得できる

for (int i = 0; i < 5; i++) {
  int b = i;
  q[i] = from a in q1
  select new {
    商品 = a.商品,
    数量 = a.数量[b]
  };
  q2 = q2.Concat(q[i]);
}

iとbには同じ値が入っているのに何が違うん?