Сделайте вашу жизнь проще, не выделяйте на отдельные свойства. Сделайте извлечение в виде массива:
select new {
someArray = new[]{
t2["adjustment_value"].ToString(),
t2["amount_outstanding"].ToString(),
t2["amount_outstanding_priv"].ToString(),
t2["amount_outstanding_ded"].ToString(),
...
},
SalYear = ...,
}
Таким образом, вы получите объект с 3 свойствами, двумя строками SalXxx и массивом строк (другие значения). Массив строк означает, что вы можете использовать LINQ SelectMany для его выравнивания. В примере с msdn вы увидите, что у них есть владельцы со списками домашних животных (переменное количество домашних животных, но ваши значения - фиксированное число), а после selectmany оно сведено к списку, где владелец повторяется и есть одно домашнее животное. Значения в нижнем регистре - это домашние животные, значения SalXxx - владельцы
Как только вы получите рабочий запрос, вы можете фактически интегрировать его в первый запрос ..
Извините за то, что не опубликовали полный пример ( и я пропустил нулевые проверки для ясности) - с кодом очень сложно работать на мобильном телефоне
Изменить:
Итак, вы говорите, что хотите получить результаты в определенном порядке. И у Select, и у SelectMany есть версия, в которой они дадут индекс элемента, и мы можем это использовать .. потому что вы в основном хотите иметь эти объекты:
var obj = new [] {
new { SalYear = 2018, SalMonth = 1, C = new[] { "av1", "ao1", "aop1", "aod1" } },
new { SalYear = 2018, SalMonth = 2, C = new[] { "av2", "ao2", "aop2", "aod2" } }
};
Будьте как av1, av2, ao1, ao2..
, поэтому мы хотим чтобы отсортировать результаты сначала по индексу внутреннего массива, затем по индексу внешнего массива
Мы используем SelectMany, чтобы выкопать внутренний массив, а затем для каждого элемента во внутреннем массиве мы создаем новый объект, имеющий данные и индексы (внутреннего и внешнего):
obj.SelectMany((theOuter, outerIdx) =>
theOuter.C.Select((theInner, innerIdx) =>
new {
SalYear = theOuter.SalYear,
SalMonth = theOuter.SalMonth,
DataItem = theInner,
OuterIdx = outerIdx,
InnerIdx = innerIdx
}
)
).OrderBy(newObj => newObj.InnerIdx).ThenBy(newObj => newObj.OuterIdx)
Вы, вероятно, обнаружите, что вам не нужны ThenBy; сортировка по InnerIdx оставит ie (каждый InnerIdx в моем списке представлен дважды - есть два innerIdx = 0 et c) и вещи в linq сортируют, насколько они не могут, а затем - потому что они отсортированы по OuterIdx уже (когда они вошли в запрос) они должны оставаться отсортированными по OuterIdx после того, как они t ie на InnerIdx .. Если это имеет смысл. Ремень и подтяжки!